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



>假设我有 2 个实现 INotifyPropertyChanged (在本例中为 Prism NotificationObject)的虚拟机类,并且我希望一个虚拟机响应另一个虚拟机中的属性更改?

假设它们都是作为父 VM 上的属性的子 VM,有哪些方法可以在不使用事件聚合器/中介的情况下将它们从父 VM 连接起来?

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

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

其次,在

MVVM 的理念中,这是一种可以接受的方式吗?

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

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

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

我还建议在源类中创建自定义事件,这样您就不会依赖OnPropertyChanged和属性名称"魔术字符串"。


就 MVVM 和良好设计的理念而言,我认为它确实有些偏差,因为现在您的两个视图模型更加紧密地耦合在一起。 这并不是说这种方法一定不好,但似乎 Prism 的事件聚合器可能是一个更好的选择。

最新更新