【问题标题】:Parent-Child ViewModel Communication in WPF - Prism MVVMWPF 中的父子 ViewModel 通信 - Prism MVVM
【发布时间】:2017-11-21 12:11:25
【问题描述】:

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

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

当我说通信时,我的意思是允许父视图模型(例如“地址簿 VM”)访问子视图模型(例如“Person VM”)及其所有属性...因为这就是我一直以来的情况教做。我会通过在父视图模型中拥有一个子视图模型属性然后简单地在视图中使用内容控件并将其数据上下文设置为子视图模型来实现这一点。由此我有一个层次结构,父可以访问子属性,或者子可以使用父等中的命令。

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

现在,如果您读到的任何关于使用 Prism 或 MVVM 模式的内容听起来根本不正确,那么请通知我 - 我全神贯注。我很有可能以错误的方式处理所有事情。

【问题讨论】:

  • 这里的场景是什么?为什么需要从父母和孩子那里访问孩子和父母的属性?它们中的每一个都可能有自己的视图,显示这些属性。

标签: wpf mvvm prism


【解决方案1】:

mm8 所说的,尽管我发现 EventAggregator 对于您所说的那种子视图模型来说太过分了。

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

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

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

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

【讨论】:

  • DataTemplate 方法的缺点是您必须显式设置模板以将每个视图模型与用户控件相关联。基于约定更好,您可以继承 UserControl,例如,激活 ViewModelLocator 那里,并覆盖 VML 分辨率以根据命名来定位类型,例如。请注意,这并不是说 DataTemplates 通常没有用处。
【解决方案2】:

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

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

【讨论】:

  • 感谢您的回答!我会调查这个
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-14
  • 1970-01-01
  • 1970-01-01
  • 2011-06-20
  • 1970-01-01
相关资源
最近更新 更多