Как распространять события из одной 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/

Другие вопросы по тегам