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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.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-Prism MVVM中的父子视图模型通信_Wpf_Mvvm_Prism - Fatal编程技术网

WPF-Prism MVVM中的父子视图模型通信

WPF-Prism MVVM中的父子视图模型通信,wpf,mvvm,prism,Wpf,Mvvm,Prism,我是一名初级开发人员,最近开始研究WPF/MVVM,几个月后,我会说我是一名相当不错的WPF开发人员,能够很好地使用MVVM模式。现在我偶然发现了Prism,它吸引了我,因为它提供了一些很好的特性。然而,在启动了一个测试Prism库的实践应用程序之后,我遇到了一些问题,这些问题在使用常规的旧WPF/MVVM时从来都不是问题我的主要问题: 使用Prism在父视图模型和子视图模型之间进行通信的最佳方式是什么? 当我说通信时,我的意思是允许父视图模型(如“地址簿VM”)访问子视图模型(如“个人VM”)

我是一名初级开发人员,最近开始研究WPF/MVVM,几个月后,我会说我是一名相当不错的WPF开发人员,能够很好地使用MVVM模式。现在我偶然发现了Prism,它吸引了我,因为它提供了一些很好的特性。然而,在启动了一个测试Prism库的实践应用程序之后,我遇到了一些问题,这些问题在使用常规的旧WPF/MVVM时从来都不是问题我的主要问题

使用Prism在父视图模型和子视图模型之间进行通信的最佳方式是什么?

当我说通信时,我的意思是允许父视图模型(如“地址簿VM”)访问子视图模型(如“个人VM”)及其所有属性。。。因为这就是我被教导要做的。我可以通过在父视图模型中拥有子视图模型属性,然后在视图中简单地使用内容控件并将其datacontext设置为子视图模型来实现这一点。从这里我有了一个层次结构,父级可以访问子级的属性,或者子级可以在父级中使用命令等等

然而,当使用Prism实例化视图模型时,我使用ViewModelLocator——它为我们找到视图模型并实例化它。使用此方法时,父对象中没有引用视图模型的子属性,这意味着父对象无法轻松访问子对象的属性,反之亦然。有没有简单的解决办法


现在,如果你读到的任何关于Prism或MVVM模式的使用听起来根本错误,那么请告诉我-我洗耳恭听。我很有可能以错误的方式处理所有问题。

您可以使用事件聚合器以松散耦合的方式在两个视图模型之间进行通信。有关该概念的更多信息,请参阅以下博客帖子:

使用事件聚合器模式在视图模型之间进行通信:


Prism的官方GitHub网站上有一个完整的代码示例:

mm8说了什么,尽管我发现EventAggregator对于您所讨论的儿童视图模型来说有些过分

在我看来,使用ViewModelLocator模式会使事情变得复杂,它会使viewmodels的实例化变魔术般地消失,从而使您不得不使用松散耦合的解决方案,如EventAggregator来处理所有问题。EventAggregator是一个很棒的工具,我在我所有的项目中都使用它,但是您使用ViewModelLocator迫使您使用它或类似的工具,这并不好

如果您可以反转项目的因果流,以便代码实例化ViewModels,并使用DataTemplates提供视图,那么您通常会发现这样的问题消失了,您可以简单地实例化自己的子ViewModels,并以正常方式检查子viewmodel属性

解释了为什么ViewModelLocator被认为是必要的,但是自从使用d:DesignInstance来指定设计时数据上下文成为可能以来,对它的需求已经减少了,imho


d:DataContext=“{d:DesignInstance myNamespace:MyViewModel,IsDesignTimeCreatable=True}”

谢谢您的回答!我会调查一下这里的情况是什么?为什么需要从父级和子级访问子级和父级属性?它们中的每一个都可能有自己的视图,显示这些属性。DataTemplate方法的缺点是必须显式设置一个模板,以将每个视图模型与用户控件关联。基于约定更好,例如,您可以将UserControl子类化,在那里激活ViewModelLocator,并重写VML解析以基于命名定位类型。注意,这并不是说数据模板通常没有用处。