【问题标题】:How can I listen in my ViewModel to changes from another ViewModel?如何在我的 ViewModel 中监听来自另一个 ViewModel 的更改?
【发布时间】:2012-02-05 19:19:41
【问题描述】:

我的任务是编写一个用户控件以使用 MVVM 模式显示一些结果。

主应用程序(称为ApplicationVM)有两个a 属性UserControlViewModelSelectedRecord。第一个属性包含UserControlViewModel 的一个实例。在 XAML 中,我使用这些属性将UserControl 绑定到UserControlViewModel。 DependencyProperty PageCount 用于在视图中的显示函数和 UserControlViewModel 之间进行简单通知。

<control:UserControl DataContext="{Binding UserControlViewModel}" PageCount="{Binding DocumentPageCount}" />

这是 ApplicationViewModel 中第二个属性的实现。

public Record SelectedRecord
{
    get
    {
        return m_SelectedRecord;
    }
    set
    {
        m_SelectedRecord = value;
        OnPropertyChanged("SelectedRecord");
    }
}

稍后,此属性将被替换。但我应该做的是在属性“SelectedRecord”和“UserControlViewModel”的“Record”之间建立依赖关系,它调用一个函数来生成新内容(例如GenerateContent())。如何使SelectedRecord 属性的更改更新UserControlViewModelRecord 属性以生成新内容?或者我的UserControlViewModel 可以听到OnPropertyChanged("SelectedRecord") 自动生成新内容吗?

【问题讨论】:

标签: c# wpf mvvm


【解决方案1】:

我会使用信使 - 这样您的视图模型可以很好地解耦。

这是关于 SO 的一个帖子,讨论的是 MVVM 灯中的那个:

MVVM light - how to access property in other view model

【讨论】:

    【解决方案2】:

    一个简单的解决方案是更新 SelectedRecord 属性的设置器。在这里,您可以调用 UserControlViewModel 上的 GenerateContent 方法,如果需要,还可以在那里设置 SelectedRecord 属性。

    另外,您的 UserControlViewModel 可以侦听 ApplicationVM 上的 PropertyChanged 事件,但要做到这一点,UserControlViewModel 需要对 ApplicationVM 的引用。

    最后,您可以使用事件系统在视图模型之间进行通信。这将确保您的视图模型很好地解耦,但代价是增加了复杂性。如果您有兴趣,请查看Prism Event Aggregator 上的文档。

    【讨论】:

      猜你喜欢
      • 2019-06-01
      • 1970-01-01
      • 2014-06-15
      • 1970-01-01
      • 2021-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-01
      相关资源
      最近更新 更多