How should one propagate events from one ViewModel to another ViewModel in MVVW?
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
开发者_Go百科 {
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));
}
}
}
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
.
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
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/
精彩评论