Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.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
Wpf 这是一个VM响应另一个VM中属性更改的可接受方式吗?_Wpf_Mvvm_Prism - Fatal编程技术网

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

Wpf 这是一个VM响应另一个VM中属性更改的可接受方式吗?,wpf,mvvm,prism,Wpf,Mvvm,Prism,假设我有两个VM类实现INotifyPropertyChanged(本例中为Prism NotificationObject),我希望一个VM响应另一个VM中的属性更改 假设这两个都是作为父VM上的属性的子VM,那么有哪些方法可以将它们从父VM连接起来而不使用事件聚合器/中介器 我计划让侦听VM通过父VM连接到另一个VM的PropertyChanged事件来公开ICommand(PRISM DelegateCommand) 首先,这是一种可以接受的方式吗?其次,如何将ICommand连接到事件?

假设我有两个VM类实现INotifyPropertyChanged(本例中为Prism NotificationObject),我希望一个VM响应另一个VM中的属性更改

假设这两个都是作为父VM上的属性的子VM,那么有哪些方法可以将它们从父VM连接起来而不使用事件聚合器/中介器

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

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


其次,在MVVM的理念范围内,这是一种可以接受的方法吗?

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

sourceVM.PropertyChanged += (sender, args) => {
    if (args.PropertyName.Equals("Property to listen for"))
    {
        targetVM.Method();
    }
};
或者,如果目标需要是
ICommand
而不是常规方法,则使用
targetVM.Command.Execute(null)取而代之

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



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

更直截了当——因为您的事件侦听器具有对目标类的完全访问权限,所以您可以直接调用该方法/命令

sourceVM.PropertyChanged += (sender, args) => {
    if (args.PropertyName.Equals("Property to listen for"))
    {
        targetVM.Method();
    }
};
或者,如果目标需要是
ICommand
而不是常规方法,则使用
targetVM.Command.Execute(null)取而代之

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



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

使用中介模式可能仍然是实现视图模型之间通信的最佳方式;是否有理由将视图模型紧密耦合在一起?不只是探索不同的选项并了解可能的情况使用中介模式可能仍然是实现视图模型之间通信的最佳方式;你想把视图模型紧密地结合在一起有什么原因吗?不只是探索不同的选项,看看有什么可能,谢谢你的建议!这是一个完美的解决方案,但我同意它确实引入了更高的耦合性,但由于它在父视图模型中,而那些子视图模型是静态(例如编译时)依赖关系,我认为这可能是一个可以这样做的场合,因为您使用
String.Equals而不是
=
?与Java不同,C#在使用
=
运算符时,会按值比较字符串。@Matthew谢谢,我不知道这一点。我想我养成了使用
String.Equals
的习惯,因为它有一个不区分大小写的覆盖,但这在这里并不适用。太好了,谢谢你的建议!这是一个完美的解决方案,但我同意它确实引入了更高的耦合性,但由于它在父视图模型中,而那些子视图模型是静态(例如编译时)依赖关系,我认为这可能是一个可以这样做的场合,因为您使用
String.Equals而不是
=
?与Java不同,C#在使用
=
运算符时,会按值比较字符串。@Matthew谢谢,我不知道这一点。我想我已经养成了使用
String.Equals
的习惯,因为它有一个不区分大小写的覆盖,但这在这里并不适用。