Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在ViewModel中侦听来自另一个ViewModel的更改?_C#_Wpf_Mvvm - Fatal编程技术网

C# 如何在ViewModel中侦听来自另一个ViewModel的更改?

C# 如何在ViewModel中侦听来自另一个ViewModel的更改?,c#,wpf,mvvm,C#,Wpf,Mvvm,我的任务是编写一个用户控件,使用MVVM模式显示一些结果 主应用程序(称为ApplicationVM)有两个属性UserControlViewModel和SelectedRecord。第一个属性包含UserControlViewModel的实例。在XAML中,我使用这些属性将UserControl绑定到UserControlViewModel。DependencyPropertyPageCount用于视图中的显示功能和UserControlViewModel之间的简单通知 <control

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

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

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

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

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

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


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

我会使用messenger,这样您的视图模型可以很好地解耦

这里有一个关于MVVM的话题:


看一看,您应该在此处使用中介模式()
public Record SelectedRecord
{
    get
    {
        return m_SelectedRecord;
    }
    set
    {
        m_SelectedRecord = value;
        OnPropertyChanged("SelectedRecord");
    }
}