我正在使用MVVM,我想在viewmodels之间进行通信。我有一个用户控件,其中包含另一个用户控件,我希望父用户控件在子项中的属性更改时运行一些代码。我已经看到了几种在视图模型之间进行通信的方法,例如使用MVVM Light Messenger或PRISM Event Aggregator,但我希望有一些方法可以通过某种方式订阅通过{{PropertyChanged
事件引发的INotifyPropertyChanged
事件。 1}}实施。
Matt Hamilton在this post中有一个答案,但是我很难实现它,因为它需要一个DependencyObject,而我的ViewModel是POCO而不是DO
是否有某种方法可以使用INotifyPropertyChanged
系统,因为我不希望实现消息传递系统。如果不是消息系统最好的?我还看到一个例子,其中一些人只是使用视图后面的代码来帮助传递属性,但是我不想打破MVVM模式,因为我想在稍后阶段进行一些测试。
答案 0 :(得分:2)
肯定有多种方法可以处理您的方案。一个肯定是使用INotifyPropertyChanged
实现来传播你的事件。问题是容器需要直接引用子ViewModel来订阅PropertyChanged
事件。
类ParentVM { private const string SomePropertyName =“SomeProperty”;
public ParentVM()
{
ChildVM child = new ChildVM();
child.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(child_PropertyChanged);
}
void child_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
if (e.PropertyName == SomePropertyName)
{
//Do something!!!
}
}
}
您还可以明确定义事件并订阅它。
答案 1 :(得分:2)
我个人会将父视图模型的引用传递给每个子视图模型以便直接访问。
我倾向于尽可能地避开MVVM Light“Messenger”。 (在使用IoC容器时它有点无用,但这是另一个故事)