如何在ViewModel中监听来自另一个ViewModel的更改?

时间:2012-02-05 19:19:42

标签: c# wpf mvvm

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

主要应用程序(称为ApplicationVM)有两个属性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”和“Record”的“UserControlViewModel”之间建立一个依赖关系,它调用一个函数来生成新内容(例如GenerateContent())。如何更改SelectedRecord属性更新Record UserControlViewModel属性以生成新内容?或者我的UserControlViewModel可以听到OnPropertyChanged("SelectedRecord")自动生成新内容吗?

2 个答案:

答案 0 :(得分:4)

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

这是SO上谈论MVVM中的一个线程:

MVVM light - how to access property in other view model

答案 1 :(得分:3)

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

或者,您的UserControlViewModel可以侦听ApplicationVM上的PropertyChanged事件,但为此,UserControlViewModel需要对ApplicationVM的引用。

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