【问题标题】:How should one propagate events from one ViewModel to another ViewModel in MVVW?应该如何将事件从一个 ViewModel 传播到 MVVM 中的另一个 ViewModel?
【发布时间】:2011-02-15 21:19:49
【问题描述】:

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

【问题讨论】:

    标签: wpf viewmodel eventaggregator


    【解决方案1】:

    您当然可以使用事件聚合器,但您不需要一个像这样简单的东西。您可以让ListViewViewModel 收听TreeViewViewModel.PropertyChanged

    【讨论】:

    • 这会在两个视图模型之间创建一个直接引用,不是吗?我对 MVVW 的理解是强烈建议不要这样做……但我承认,严格遵守框架准则有时会带来额外的工作而无益。
    • 您从哪里得知强烈建议不要这样做?如果视图模型之间存在关系,那么它们之间保持对彼此的引用是完全明智的。例如,参见 msdn.microsoft.com/en-us/magazine/dd419663.aspx#id0090016 中 MainWindowViewModel 和 WorkspaceViewModel 之间的关系。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-25
        • 2020-05-19
        • 1970-01-01
        • 2019-07-09
        • 2021-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多