如何在我的ViewModel中侦听来自另一个ViewModel的更改

本文关键字:ViewModel 另一个 我的 | 更新日期: 2023-09-27 18:22:28

我的任务是编写一个用户控件,通过使用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"answers"UserControlViewModel"的"Record"之间建立依赖关系,后者调用一个函数来生成新内容(例如GenerateContent())。如何使SelectedRecord属性的更改能够更新UserControlViewModelRecord属性以生成新内容?或者我的UserControlViewModel可以听到OnPropertyChanged("SelectedRecord")自动生成新内容吗?

如何在我的ViewModel中侦听来自另一个ViewModel的更改

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

这里有一个关于SO的帖子,谈论MVVM中的一个:

MVVM灯-如何访问其他视图模型中的属性

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

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

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