【问题标题】:How to communicate between Parent Window and Child User Control using WPF MVVM如何使用 WPF MVVM 在父窗口和子用户控件之间进行通信
【发布时间】:2018-07-13 02:19:57
【问题描述】:

我对 WPF MVVM 比较陌生。我目前正在做一个小项目,以了解有关 WPF MVVM 概念的详细信息,并且面临一个我无法理解的小问题。

我有一个带有<ContentControl Content="{Binding Path=CurrentViewModel}" /> 的主窗口,并且在主窗口 ViewModel 类上设置了 CurrentViewModel 属性。主窗口具有三个按钮控件,用于列出、编辑和删除实体。 ContentControl 加载一个 UserControl (ListEntities),它列出了来自某个数据存储的所有实体。 UserControl xaml 有自己的 ViewModel 类,该类被设置为 ContentControl 内容属性,并且使用 DataTemplates 加载视图。

这一切都很好。我的要求是,当用户在 ListEntities UserControl GridView 中选择一行时,必须启用编辑和删除按钮(使用 ICommand 基础结构的 CanExecute 方法)。问题是我可以基于 SelectedItem 属性绑定在 UserControl ViewModel 类上设置 SelectedEntity 属性,但是如何使所选项目可用于主窗口视图模型类以启用编辑/删除按钮(如何从父视图中我会知道子视图中的一个项目是使用 MVVM 模式选择的)。因此,以更通用的方式,我试图了解 基于父视图或子视图中的某些事件启用父窗口的独立 ViewModel 和子用户控件之间的通信的最标准过程。

【问题讨论】:

  • 您将通过依赖注入 (DI) 将您的 ID 或实体发送到您的 ViewModel。换句话说,您需要一个可以接收参数(id 或实体)的构造函数。
  • 在这里您可以创建一个非常简洁的minimal reproducible example 并将其发布在您的问题中。就目前而言,这是一团糟。我只能收集到你在做 MVVM 完全错误,但我真的不能说。

标签: wpf mvvm wpf-controls


【解决方案1】:

我喜欢在 ViewModel 之间进行通信的一种方法是Publish and Subscribe。大多数 MVVM 框架都提供类似 EventAggregatorMessenger 的东西

该模式是您通过DIMessenger 传递到ViewModel(有时对于以解耦方式查看的视图也很有用),并且在您订阅的另一侧发送通知。发布订阅。

还实现了一些不错的功能,例如传递paylod、键入的消息和回调以通知发件人。 您绝对应该对此主题进行进一步调查。

因为它总是从 Parent Child 开始,很快就会变得花哨。打开对话框以加载文件等......因此,在我看来,PubSub 将是要走的路,在这里获得最好的解耦。但是过于小心处理也会导致混乱......

棱镜

事件聚合器https://msdn.microsoft.com/en-us/library/ff921122(v=pandp.20).aspx

MVVM 灯

http://dotnetpattern.com/mvvm-light-messenger (http://www.mvvmlight.net/help/WP8/html/9fb9c53a-943a-11d7-9517-c550440c3664.htm)。

反应式用户界面

https://reactiveui.net/docs/handbook/message-bus/

Caliburn Micro 事件聚合器 https://caliburnmicro.com/documentation/event-aggregator

希望这会有所帮助(链接只是随机排序而不是按偏好排序,所以这取决于你 =) ...)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多