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));
}
}
}
Answers. It is perfectly right to have ViewModel contains ViewModel.
Your ViewModels may not possess any references (member variables, properties, mutable/immutable fields) to any Views.
ViewModel is the right place to handle business logic in the UI layer. The ViewModel is also in charge of handling events and delegating them to other layers of the hierarchy when business logic needs to be applied to modify application data.
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/
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With