这是VM对另一个VM中的属性更改做出响应的可接受方式吗?

时间:2012-11-14 00:54:39

标签: wpf mvvm prism

假设我有2个VM类实现了INotifyPropertyChanged(在这种情况下是Prism NotificationObject),我想让一个VM响应另一个VM中的属性更改?

假设这些子虚拟机都是父虚拟机上的属性,有什么方法可以在不使用事件聚合器/中介的情况下从父虚拟机连接它们?

我计划让侦听VM公开的ICommand(PRISM DelegateCommand)通过父虚拟机连接到另一个VM的PropertyChanged事件。

首先,这是一种可接受的方式吗?其次,如何将ICommand连接到事件?我是否必须使用附加行为,例如程序化EventToCommand或类似的,还是有更直接的方式来做到这一点?

其次,在MVVM的哲学中,这是否是一种可以接受的方式?

1 个答案:

答案 0 :(得分:3)

它更直接 - 因为您的事件侦听器具有对目标类的完全访问权限,您可以直接调用方法/命令。

sourceVM.PropertyChanged += (sender, args) => {
    if (args.PropertyName.Equals("Property to listen for"))
    {
        targetVM.Method();
    }
};

或者,如果目标需要是ICommand而不是常规方法,那么请改用targetVM.Command.Execute(null);

我还建议您在源类中创建自定义事件,这样您就不会依赖OnPropertyChanged和属性名称“magic string”。


就MVVM的理念和优秀的设计而言,我认为它确实有些偏离,因为现在你的两个视图模型更加紧密耦合。这并不是说这种方法必然不好,但看起来Prism的事件聚合器似乎是更好的选择。