Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.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# PRISM/MEF:2个窗口';模特们互相交谈?_C#_Wpf_Window_Prism_Mef - Fatal编程技术网

C# PRISM/MEF:2个窗口';模特们互相交谈?

C# PRISM/MEF:2个窗口';模特们互相交谈?,c#,wpf,window,prism,mef,C#,Wpf,Window,Prism,Mef,基本上,我不确定从哪里开始: 我有我的Shell.xaml窗口。 我还有我的Popup.xaml窗口 我将Shell.xaml设置为导入PopupWindow,然后当PopupWindow加载事件激发时,它会: Popup.Owner = this; Popup.Show(); 现在,我需要能够让PopupWindow的ViewModel与Shell.xaml通信。基本上,我需要能够让弹出窗口告诉Shell的ViewModel信息用户输入 更新: 为了保持这种解耦,我不想将客户机的viewm

基本上,我不确定从哪里开始:

我有我的Shell.xaml窗口。 我还有我的Popup.xaml窗口

我将Shell.xaml设置为导入PopupWindow,然后当PopupWindow加载事件激发时,它会:

Popup.Owner = this;
Popup.Show();
现在,我需要能够让PopupWindow的ViewModel与Shell.xaml通信。基本上,我需要能够让弹出窗口告诉Shell的ViewModel信息用户输入


更新:
为了保持这种解耦,我不想将客户机的viewmodel的任何实例传递到弹出窗口,我更希望弹出窗口的ViewModel能够以某种方式与客户端的ViewModel通信,而不知道它实际上在与谁通信。

我不是PRISM/MEF专家,但如果我要解决这个问题,我会采取稍微不同的方法,并增加一点解耦。基本上,您希望窗口(Shell和弹出窗口)的视图模型进行通信-窗口(视图)应仅与用户通信并更新其视图模型的属性(以解耦、模型绑定的方式)

一旦您处于此位置,Shell的视图模型就可以请求弹出窗口的视图模型的用户信息(比如从属性)。当然,它们不是Shell或Popup的视图模型——它们只是这些视图碰巧绑定到的视图模型:)

我认为,纯粹主义者会更进一步,讨论不同通信方之间的消息队列,但每次只讨论一步

编辑

迈克尔的评论如下:

正如我所说,我不是棱镜方面的专家,但我认为这取决于你们想在解耦方面走多远。没有什么可以阻止客户端ViewModel创建和显示弹出窗口,然后在处理它之前查询弹出窗口的ViewModel以获取数据。它不是纯粹的MVVM,因为您的客户机ViewModel正在与弹出窗口及其ViewModel进行一些相当直接的通信,但它可以工作,并且没有那么大的问题

在这样的情况下,我会采取务实的方法,不管怎样,在这种情况下,自然的依赖性是存在的。您仍然可以分离视图和视图模型


我想这里有人可以指导一种更为解耦的方法,我也有兴趣阅读这方面的内容。

看看Prism中的事件聚合器。Prism中的聚合事件旨在促进解耦的视图模型间通信。如果您选择的是“纯”MVVM,我认为应该是这样的:

  • ViewModel会发布一条消息(交互请求),以显示弹出窗口
  • 您的视图正在侦听消息,并显示弹出窗口(将viewmodel与如何显示提示分离)
  • 您的ViewModel获得弹出窗口的结果(您的弹出窗口只是一个视图,应该不知道如何引发聚合事件)
  • ViewModel引发Prism聚合事件(包含用户输入的对象是有效负载)
  • 您的shell正在侦听该事件

您有没有调查过。我通常使用它来创建模态对话框,将数据返回给调用它们的人。考虑到视图模型的一个定义特征是它可以在视图之间共享,这似乎有些奇怪。是的,我的目的是让视图模型彼此对话,正如我的帖子所说,很遗憾,我在标题中遗漏了这个关键字。它应该(现在也应该)阅读
windows的viewmodels