5

我是 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));
        }
    }
}
4

3 回答 3

3

你当然可以使用事件聚合器,但你不需要一个像这样简单的东西。你可以简单地ListViewViewModelTreeViewViewModel.PropertyChanged

于 2011-02-16T01:57:16.560 回答
2

EventAggregator 是一个不错的选择,您的代码对我来说是正确的。其他选项将是 SharedService 或只是从一个视图模型直接引用到另一个视图模型。Prism 框架对此主题有一个很好的文档:http: //msdn.microsoft.com/en-us/library/ff921122 (v=PandP.40).aspx

于 2011-02-15T21:49:09.150 回答
1

您的另一种选择是中介模式,这里是一个例子: http: //marlongrech.wordpress.com/2009/04/16/mediator-v2-for-mvvm-wpf-and-silverlight-applications/

于 2011-02-16T03:16:02.667 回答