Как распространять события из одной ViewModel в другую ViewModel в MVVW?
Я новичок в модели MVVW, поэтому вы должны простить меня, если я задам очень простой вопрос.
У меня есть две ViewModel, мы будем называть их TreeViewViewModel и ListViewViewModel. TreeViewViewModel привязывается к свойству IsSelected в своем представлении. Всякий раз, когда IsSelected изменяется, мне нужно сообщить ListViewViewModel, чтобы он мог обновить свой вид.
После некоторых онлайн-исследований я наткнулся на EventAggregator, который выглядит так, как будто это может быть хорошим решением.
Это правильное решение? Если так, как я должен идти о реализации этого? Или есть лучшее решение, которое я должен рассмотреть? Ниже приведена упрощенная версия того, как, я думаю, EventAggregator может быть интегрирован в ViewModel, публикующую событие.
public class TreeViewViewModel : INotifyPropertyChanged
{
public bool IsSelected
{
get { return _isSelected; }
set
{
if (value == _isSelected)
return;
_isSelected = value;
OnPropertyChanged("IsSelected");
// Is this sane?
_eventAggregator.GetEvent<TreeViewItemSelectedEvent>().Publish(value);
}
}
protected virtual void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
3 ответа
Вы, конечно, можете использовать агрегатор событий, но он вам не нужен для чего-то такого простого. Вы можете просто иметь ListViewViewModel
слушать TreeViewViewModel.PropertyChanged
,
EventAggregator - хороший вариант, и ваш код выглядит правильно для меня. Другими вариантами могут быть SharedService или просто прямая ссылка от одной модели представления к другой. У платформы Prism есть хорошая документация по этой теме: http://msdn.microsoft.com/en-us/library/ff921122(v=PandP.40).aspx
Другой вариант - шаблон посредника, вот один пример: http://marlongrech.wordpress.com/2009/04/16/mediator-v2-for-mvvm-wpf-and-silverlight-applications/