PRISM / MEF:2个窗口的视图模型如何相互通信?

时间:2011-03-30 19:37:34

标签: c# wpf window prism mef

基本上,我不知道从哪里开始:

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

我设置Shell.xaml以导入PopupWindow然后当PopupWindow Loaded事件触发时,它会:

Popup.Owner = this;
Popup.Show();

现在,我需要能够让PopupWindow的ViewModel与Shell.xaml进行通信。基本上,我需要能够让PopupWindow告诉用户输入Shell的ViewModel信息。


更新

为了保持这种分离,我不想将客户端的viewmodel的任何实例传递给弹出窗口,我更倾向于让Popup的ViewModel以某种方式与客户端的ViewModel通信而不知道它是谁实际上在说话。

2 个答案:

答案 0 :(得分:7)

查看Prism中的事件聚合器。 Prism中的聚合事件旨在促进解耦,视图间模型通信。如果你想要“纯粹的”MVVM,我认为它将会是这样的:

  • 您的ViewModel会发布一条消息(交互请求),希望显示一个弹出窗口。
  • 您的视图正在侦听该消息,并显示弹出窗口(将您的视图模型与理解提示的显示方式分离)
  • 您的ViewModel获取弹出窗口的结果(您的弹出窗口只是一个视图,并且应该对提高聚合事件一无所知)
  • 您的ViewModel引发Prism Aggregate事件(包含用户输入的对象是有效负载)
  • 您的shell正在侦听该事件。

答案 1 :(得分:1)

我不是PRISM / MEF大师,但如果我正在攻击这个问题,我会采取稍微不同的方法,并添加一点点脱钩。基本上,您希望窗口(Shell和Popup)的 ViewModels 进行通信 - 窗口(视图)应该只与用户通信并更新属性(在解耦的模型中 - 限制时尚)在 ViewModels

一旦你处于这个位置,那么Shell的 ViewModel 可以请求Popup的 ViewModel 的用户信息(例如来自属性)。当然,它们不是Shell或Popup的 ViewModels - 它们只是 ViewModels ,这些视图恰好被绑定到:)

纯粹主义者会更进一步,谈论各个交流方之间的消息队列,但每次只有一步,这是一个步骤。

修改

根据迈克尔的评论:

正如我所说,我不是PRISM的专家,但我认为这取决于你想要脱钩的程度。没有什么能阻止Client ViewModel创建并显示弹出窗口,然后在处理之前查询弹出窗口的ViewModel数据。它不是纯粹的MVVM,因为你的客户端ViewModel正在与Popup及其ViewModel进行一些相当直接的通信,但它会起作用并且它不是那么大的罪。

在这样的情况下,我会采用务实的方法,无论如何都存在自然依赖。您仍然可以分离View和ViewModel。

我想这里有些人可以指导一种更加分离的方法 - 我也有兴趣阅读。