【问题标题】:PRISM/MEF: How can 2 windows' viewmodels talk to each other?PRISM/MEF:2 个窗口的视图模型如何相互通信?
【发布时间】:2011-03-30 19:37:34
【问题描述】:

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

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

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

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

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


更新:

为了保持这种解耦,我不想将客户端视图模型的任何实例传递给弹出窗口,我更希望弹出窗口的视图模型以某种方式与客户端的视图模型进行通信而不知道它是谁实际交谈。

【问题讨论】:

  • 您查看过InteractionRequest。我通常使用它来创建模式对话框,将数据返回给调用它们的人
  • 考虑到视图模型的定义特征之一是它可以跨视图共享,这似乎很奇怪。

标签: c# wpf window prism mef


【解决方案1】:

查看 Prism 中的事件聚合器。 Prism 中的聚合事件旨在作为一种促进解耦的视图模型间通信的手段。如果您要使用“纯”MVVM,我认为它会是这样的:

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

【讨论】:

  • Prism 的 EventAggregator 正是出于这个原因而制作的,它在允许解耦模块方面非常强大。
  • 这绝对是我想要的。
【解决方案2】:

我不是 PRISM/MEF 专家,但如果我要解决这个问题,我会采取稍微不同的方法并增加一点脱钩。本质上,您希望窗口(Shell 和 Popup)的 ViewModels 进行通信 - 窗口(Views)应该只与用户通信并更新属性(在解耦的模型中 -绑定时尚)在他们的 ViewModels 上。

一旦您处于此位置,Shell 的 ViewModel 就可以请求 Popup 的 ViewModel 的用户信息(例如来自属性)。当然,它们不是 Shell 或 Popup 的 ViewModels - 它们只是这些 View 碰巧绑定到的 ViewModels :)

纯粹主义者会走得更远,讨论各个通信方之间的消息队列,但我认为是一步一步来的。

编辑

根据迈克尔的评论:

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

在这种自然依赖存在的情况下,我会采用务实的方法。您仍然有 View 和 ViewModel 的分离。

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

【讨论】:

  • 是的,我的目的是让 ViewModel 像我的帖子所说的那样互相交谈,遗憾的是我在标题中省略了那个关键字。它应该(现在确实)读取windows' viewmodels
猜你喜欢
  • 2012-04-13
  • 2010-11-07
  • 2011-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
相关资源
最近更新 更多