|
ICommand в MVVM
|
|||
---|---|---|---|
#18+
Добрый день. Есть листбокс в родительском окне и дочернее окно. Надо через mvvm реализовать передачу и изменение определенной записи с листбокса. Передачу реализовать получается, но изменение в дочернем не приводит к изменение в родителе. Как это сделать без всяких статических классов - чисто по канонам mvvm ? Хамл View - родителя: <Button x:Name="btnUpdate" Command="{Binding Path=MyCommand}" CommandParameter="{Binding ElementName=lstPerson, Path=SelectedItem}" /> <ListBox x:Name="lstPerson" Grid.Row="2" ItemsSource="{Binding Persons}" /> Код ViewModel public class PersonViewModel { private ObservableCollection<Person> _personList; public PersonViewModel() { _personList = new ObservableCollection<Person>(); _personList.Add(new Person() {Name = "Dima", Address = "Moscow"}); _personList.Add(new Person(){Name="Vova",Address="Moscow"}); } public ObservableCollection<Person> Persons { get { return _personList; } set { _personList = value; } } private ICommand myCommand; public ICommand MyCommand { get { if (myCommand == null) { myCommand = new RelayCommand<object>(CommandExecute, CanCommandExecute); } return myCommand; } } private void CommandExecute(object parameter) { var ew = new EditWindow() { DataContext = new EditViewModel() {Name = ((Person) parameter).Name, Address = ((Person) parameter).Address} }; ew.Show(); } private bool CanCommandExecute(object parameter) { return true; } } public class RelayCommand<T> : ICommand { readonly Action<T> _execute = null; readonly Predicate<T> _canExecute = null; public RelayCommand(Action<T> execute) : this(execute, null) { } public RelayCommand(Action<T> execute, Predicate<T> canExecute) { if (execute == null) throw new ArgumentNullException("execute"); _execute = execute; _canExecute = canExecute; } #region ICommand Members [DebuggerStepThrough] public bool CanExecute(object parameter) { return _canExecute == null ? true : _canExecute((T)parameter); } public event EventHandler CanExecuteChanged { add { CommandManager.RequerySuggested += value; } remove { CommandManager.RequerySuggested -= value; } } public void Execute(object parameter) { _execute((T)parameter); } #endregion // ICommand Members } ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2013, 08:44 |
|
ICommand в MVVM
|
|||
---|---|---|---|
#18+
Дочернее окно является зависимым по отношению к родительскому, соответственно тебе следует использовать тот же ViewModel для связи с данными, добавь в дочернее DataContext=ParentViewModel и все будет работать. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2013, 10:51 |
|
ICommand в MVVM
|
|||
---|---|---|---|
#18+
skoleтот же ViewModel для связи с данными, добавь в дочернее DataContext=ParentViewModel и все будет работать. Один экземпляр ParentViewModel на два окна? Так что ли: ParentViewModel { ... var childView = this; ... } ?!? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2013, 11:11 |
|
ICommand в MVVM
|
|||
---|---|---|---|
#18+
Решил проблему реализацией INotifyPropertyChangedи добавлением свойства SelectedPerson в PersonViewModel. Забиндил SelectedItem листбокса на SelectedPerson. Спасибо за наводку. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2013, 11:52 |
|
|
start [/forum/topic.php?fid=21&msg=38268092&tid=1441388]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
152ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
others: | 309ms |
total: | 545ms |
0 / 0 |