Как распространять события из одной ViewModel в другую ViewModel в MVVW? - PullRequest
5 голосов
/ 16 февраля 2011

Я новичок в шаблоне MVVW, поэтому вы должны простить меня, если я задам очень простой вопрос.

У меня есть две модели представления, мы будем называть их 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 ]

3 голосов
/ 16 февраля 2011

Конечно, вы можете использовать агрегатор событий, но вам не нужен такой простой.Вы можете просто прослушать ListViewViewModel TreeViewViewModel.PropertyChanged.

2 голосов
/ 16 февраля 2011

EventAggregator - хороший вариант, и ваш код выглядит правильно для меня.Другими вариантами могут быть SharedService или просто прямая ссылка от одной модели представления к другой.У платформы Prism есть хорошая документация по этой теме: http://msdn.microsoft.com/en-us/library/ff921122(v=PandP.40).aspx

1 голос
/ 16 февраля 2011

Другой вариант - шаблон посредника, вот один пример: http://marlongrech.wordpress.com/2009/04/16/mediator-v2-for-mvvm-wpf-and-silverlight-applications/

...