假设我有2个VM类实现了INotifyPropertyChanged(在这种情况下是Prism NotificationObject),我想让一个VM响应另一个VM中的属性更改?
假设这些子虚拟机都是父虚拟机上的属性,有什么方法可以在不使用事件聚合器/中介的情况下从父虚拟机连接它们?
我计划让侦听VM公开的ICommand(PRISM DelegateCommand)通过父虚拟机连接到另一个VM的PropertyChanged事件。
首先,这是一种可接受的方式吗?其次,如何将ICommand连接到事件?我是否必须使用附加行为,例如程序化EventToCommand或类似的,还是有更直接的方式来做到这一点?
其次,在MVVM的哲学中,这是否是一种可以接受的方式?
答案 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的事件聚合器似乎是更好的选择。