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



我是一名初级开发人员,最近开始研究WPF/MVVM,现在经过几个月,我会说我是一个半体面的WPF开发人员,可以很好地使用MVVM模式。现在我偶然发现了 Prism 它吸引了我,因为它提供了一些不错的功能。但是,在启动一个练习应用程序来测试 Prism 库之后,我遇到了一些障碍,这在使用常规的旧 WPF/MVVM 时从来都不是问题。我的主要问题

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

当我说通信时,我的意思是允许父视图模型(如"地址簿 VM")访问子视图模型(如"个人虚拟机")及其所有属性......因为这是我被教导要做的。我将通过在父视图模型中具有子视图模型属性,然后简单地在视图中使用内容控件并将其数据上下文设置为子视图模型来实现此目的。由此,我有一个层次结构,父级可以访问子项的属性,或者子项可以使用父级中的命令等。

但是,当使用Prism实例化视图模型时,我使用ViewModel定位器 - 这会为我们找到视图模型并将其实例化。使用此方法时,父属性中没有引用视图模型的子属性,这意味着父属性无法轻松访问子属性,反之亦然。有没有简单的解决方案?

现在,如果您读到的任何内容在使用 Prism 或 MVVM 模式方面听起来从根本上是错误的,那么请告诉我 - 我全都听见了。我很有可能以不正确的方式处理所有事情。

mm8 所说的,尽管我发现 EventAggregator 对于您正在谈论的那种子视图模型来说有点矫枉过正。

在我看来,通过使用 ViewModelLocator 模式使事情复杂化,该模式神奇地消除了视图模型的实例化,因此您不得不使用松散耦合的解决方案,如 EventAggregator 来处理所有事情。EventAggregator是一个很棒的工具,我在我的所有项目中都使用它,但是你对ViewModelLocator的使用迫使你使用它或类似的东西,这并不好。

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

这个问题解释了为什么 ViewModelLocator 被认为是必要的,但自从可以使用 d:DesignInstance 来指定设计时 DataContexts 以来,恕我直言,对它的需求已经消失了。

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

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

使用事件聚合器模式在视图模型之间进行通信:https://blog.magnusmontin.net/2014/02/28/using-the-event-aggregator-pattern-to-communicate-between-view-models/

Prism的官方GitHub网站上有一个完整的代码示例:https://github.com/PrismLibrary/Prism-Samples-Wpf/tree/master/14-UsingEventAggregator

最新更新