2017-06-19 60 views
0

我是一个初级开发谁最近买了寻找到WPF/MVVM,现在的好几个月后,我会说我是一个像样的WPF开发谁可以使用MVVM模式很好。现在我偶然发现了棱镜,它吸引了我,因为它提供了一些不错的功能。然而,在开始一个练习应用程序来测试Prism库之后,我使用了普通的老式WPF/MVVM,这些墙从未成为问题。 我的主要问题亲子视图模型在WPF通信 - 棱镜MVVM

什么是允许使用Prism父母和孩子视图模型之间的沟通的最佳方式?

当我说的沟通,我的意思是允许父视图模式,如“通讯簿VM”来访问子视图模型,如“个人虚拟机”和它的所有属性......因为这是我被教导要做。我可以通过在父视图模型中使用子视图模型属性,然后在视图中简单地使用内容控件并将其设置为子视图模型的datacontext来实现此目的。从这我有一个父级可以访问childs属性或孩子可以使用父级等命令的分层结构

但是,当使用Prism实例化视图模型时,我使用ViewModelLocator - 这发现视图模型为我们实例化它。使用这种方法,没有在父级引用视图模型的子属性,这意味着父级不容易访问子级属性,反之亦然。有没有简单的解决方案?

现在,如果你读过任何声音根本错误关于使用棱镜或MVVM模式,那么请告诉我 - 我所有的耳朵。我很有可能以不正确的方式接近一切。

+0

有什么情况吗?为什么你需要从父母和孩子那里获得孩子和父母的财产?它们中的每一个都可能有自己的视图,显示这些属性。 – mechanic

回答

1

什么MM8说,虽然我觉得EventAggregator是矫枉过正的那种孩子的ViewModels,你在说什么。

在我看来,通过使用ViewModelLocator模式会让视图模型的实例化更加复杂,所以您不得不使用诸如EventAggregator之类的松散耦合解决方案来处理所有事情。 EventAggregator是一个非常棒的工具,我在我的所有项目中使用它,但是使用ViewModelLocator会迫使您使用它或类似的东西,这并不好。

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

This question解释了为什么ViewModelLocator被认为是必要的,但是因为它有可能使用d:DesignInstance来指定设计时DataContexts对它的需求已经下降了,恕我直言。

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

+0

DataTemplate方法的缺点是您必须明确地设置一个模板,以将每个视图模型与用户控件相关联。基于约定的更好,你可以继承UserControl的子类,例如,在那里激活ViewModelLocator,并且覆盖VML的分辨率来定位基于命名的类型。请注意,这并不是说DataTemplates通常不会有用。 –

1

您可以使用事件聚合以松散耦合的方式两种显示模式之间进行通信。请参阅followigng博客文章有关概念的更多信息:

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

关于可棱镜官方的GitHub网站完整代码示例:https://github.com/PrismLibrary/Prism-Samples-Wpf/tree/master/14-UsingEventAggregator

+0

感谢您的回答!我会研究这个 – rejy11