powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / ICommand в MVVM
5 сообщений из 5, страница 1 из 1
ICommand в MVVM
    #38267611
Пурген
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.

Есть листбокс в родительском окне и дочернее окно. Надо через 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
}
...
Рейтинг: 0 / 0
ICommand в MVVM
    #38267844
Фотография skole
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дочернее окно является зависимым по отношению к родительскому, соответственно тебе следует использовать тот же ViewModel для связи с данными, добавь в дочернее DataContext=ParentViewModel и все будет работать.
...
Рейтинг: 0 / 0
ICommand в MVVM
    #38267900
Пурген
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skoleтот же ViewModel для связи с данными, добавь в дочернее DataContext=ParentViewModel и все будет работать.

Один экземпляр ParentViewModel на два окна? Так что ли:

ParentViewModel
{
...
var childView = this;
...

}

?!?
...
Рейтинг: 0 / 0
ICommand в MVVM
    #38268014
Пурген
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Решил проблему реализацией INotifyPropertyChangedи добавлением свойства SelectedPerson в PersonViewModel.
Забиндил SelectedItem листбокса на SelectedPerson.
Спасибо за наводку.
...
Рейтинг: 0 / 0
ICommand в MVVM
    #38268092
Фотография skole
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПургенОдин экземпляр ParentViewModel на два окна? Да, и одна комманда на оба окна тоже.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / ICommand в MVVM
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]