How should one propagate events from one ViewModel to another ViewModel in MVVW?

2k views Asked by At

I'm brand new to the MVVW pattern, so you'll have to forgive me if I'm asking a very basic question.

I have two ViewModels, we'll call them TreeViewViewModel and ListViewViewModel. TreeViewViewModel binds to an IsSelected property in its view. Whenever IsSelected changes, I need to inform ListViewViewModel so that it can update it's view.

After some research online, I've come across the EventAggregator which looks like it might be a good solution.

Is this the right solution? If so, how should I go about implementing this? Or, is there a better solution I should be considering? Below is a simplified version of how I think the EventAggregator might be integrated into the ViewModel publishing the event.

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

There are 3 answers

2
Robert Rossney On BEST ANSWER

You can certainly use an event aggregator, but you don't need one for something as simple as this. You can simply have ListViewViewModel listen to TreeViewViewModel.PropertyChanged.

0
Andrii On

EventAggregator is a good option and your code look correct to me. The other options would be SharedService or simply having direct reference from one viewmodel to another. Prism framework has a nice documentation on this topic: http://msdn.microsoft.com/en-us/library/ff921122(v=PandP.40).aspx

0
Lugoues On

Your other option is the mediator pattern, here is one example: http://marlongrech.wordpress.com/2009/04/16/mediator-v2-for-mvvm-wpf-and-silverlight-applications/