WPF中的父子ViewModel通信 - Prism MVVM

时间:2017-06-19 10:14:01

标签: wpf mvvm prism

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

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

当我说通信时,我的意思是允许父视图模型(如“地址簿虚拟机”)访问子视图模型,例如“人员虚拟机”及其所有属性......因为这就是我所做的教会做。我希望通过在父视图模型中具有子视图模型属性,然后在视图中使用内容控件并将其datacontext设置为子视图模型来实现此目的。从这里我有一个层次结构,父级可以访问子属性,或者子级可以在父级等中使用命令。

但是,当使用Prism实例化View Model时,我使用ViewModelLocator - 它为我们找到视图模型并实例化它。使用此方法,没有子属性引用父级中的视图模型,这意味着父级无法轻松访问子级属性,反之亦然。有一个简单的解决方案吗?

现在,如果你读过任何关于使用Prism或MVVM模式的根本错误的信息,那么请告诉我 - 我听见了。我很有可能以不正确的方式接近一切。

2 个答案:

答案 0 :(得分:1)

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

使用事件聚合器模式在视图模型之间进行通信: 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

答案 1 :(得分:1)

mm8说的是什么,虽然我发现EventAggregator对于你正在谈论的那种儿童视图模式来说是过度杀伤。

在我看来,你通过使用ViewModelLocator模式使事情复杂化,这种模式会消除你的视图模型的实例化,因此你必须使用松散耦合的解决方案,比如EventAggregator。 EventAggregator是一个很棒的工具,我在我的所有项目中都使用它,但是你使用ViewModelLocator迫使你使用它或类似的东西而且这样做并不好。

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

This question解释了为什么认为ViewModelLocator是必要的,但由于可以使用d:DesignInstance指定设计时DataContexts,因此它的需求已经消失了,imho。

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