Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 组合WPF视图和MVVM视图模型_C#_Wpf_Mvvm - Fatal编程技术网

C# 组合WPF视图和MVVM视图模型

C# 组合WPF视图和MVVM视图模型,c#,wpf,mvvm,C#,Wpf,Mvvm,我有一个带有嵌套WPF用户控件的UI,每个控件都有自己的视图模型。视图(XAML)层次结构的一个简单例子是: MainWindow |-> Logical group |-> Logical control |-> Second logical group |-> Third logical group |-> Logical control 每个XAML视图都有一个ViewModel,它封装了交互逻辑。我的问题是关

我有一个带有嵌套WPF用户控件的UI,每个控件都有自己的视图模型。视图(XAML)层次结构的一个简单例子是:

MainWindow
    |-> Logical group
      |-> Logical control
    |-> Second logical group
    |-> Third logical group
      |-> Logical control
每个XAML视图都有一个ViewModel,它封装了交互逻辑。我的问题是关于将视图模型状态从父视图模型传递到子视图模型

例如,
main窗口中的用户交互可以在
main窗口视图模型中设置
CurrentlySelectedGroup
变量。我需要知道
LogicalControlViewModel
中的值是什么

我考虑的主要方法有两种。首先,我可以广播一个事件
DispatchGroupSelected
,然后在
LogicalControlViewModel
中指定一个代理作为该事件的侦听器。其次,我可以将
绑定到
LogicalControlViewModel
内部的
MainWindowViewModel的
CurrentlySelectedGroup
属性


我的第一反应是使用事件在父视图模型和子视图模型之间进行通信。我认为绑定最好保持在视图模型与其视图之间。到目前为止,事件一直用于在我的ViewModel和命令之间进行通信。如果有其他可能的方向,那会更好,我很想听听。

你有没有尝试过消息总线??有几种框架实现了这种模式:

  • PRISM的EventAggregator,您可以在其中定义合同,然后发送和接收通知
  • MVVM灯,也有一个消息总线,你可以了解它
  • RectiveUI,这是我最喜欢的,它将可观察到的反应式扩展的功能与消息总线模式结合在一起,可以找到一些文档

使用这种模式,您的视图模型可以以松散耦合的方式和其他视图模型进行通信,因为每个视图模型只发送一条消息,而不关心谁来监听它。如果ViewModel想要侦听特定的消息类型,它可以订阅以仅获取这些消息。

当我说我正在考虑广播事件时,我实际上是按照消息总线的思路思考的。我有一个广播类,它有一个代表列表、一个事件列表和一个DispatchEvent调用列表。我使用Ninject将广播器注入到我的所有视图模型中。到目前为止,广播机主要用于注册视图模型以收听命令的结果。我用那个中央广播机在视图模型之间进行通信。我认为它对于我的小程序来说是足够干净的,尽管我会考虑在大型应用程序上为一个特定的视图模型编写一个广播程序。