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

3

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

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

我将 Shell.xaml 设置为导入 PopupWindow,然后当 PopupWindow 加载事件触发时,它会执行以下操作:

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

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

更新:

为了保持解耦,我不想将客户端的ViewModel实例传递给弹出窗口,我更希望Popup的ViewModel以某种方式与客户端的ViewModel进行通信,而不知道它实际上正在与谁交谈。


2
你有没有研究过 InteractionRequest?我通常使用它来实现模态对话框,以便将数据返回给调用方。 - Markus Hütter
考虑到视图模型的一个定义特征是可以在多个视图之间共享,这似乎相当奇怪。 - Jonathan Allen
2个回答

7
请看Prism中的事件聚合器。在Prism中,聚合事件旨在促进解耦的、视图模型间的通信。如果您要进行"纯" MVVM开发,我认为应该按照以下步骤进行:
- 您的视图模型发布一个交互请求消息,以显示弹出窗口。 - 您的视图监听此消息,并显示弹出窗口(使视图模型与了解如何显示提示信息相分离)。 - 您的视图模型获取弹出窗口的结果(您的弹出窗口只是一个视图,不应知道如何引发聚合事件)。 - 您的视图模型引发Prism聚合事件(负载包含用户输入的对象)。 - 您的主程序正在监听此事件。

Prism的EventAggregator就是为此而设计的,它非常强大,可以实现松耦合模块。 - Justin Young

1

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

一旦您处于这个位置,那么Shell的ViewModel就可以从Popup的ViewModel请求用户信息(例如来自属性)。然而,当然,它们不是Shell或Popup的ViewModels-它们仅仅是这些视图所绑定的ViewModels:)

纯粹主义者甚至会进一步谈论各种沟通方之间的消息队列,但我认为一步一步来。

Dan

编辑

根据Michael的评论:

就我所知,我不是PRISM的专家,但我认为这取决于你想要达到多少解耦。没有什么可以阻止客户端ViewModel创建和显示弹出窗口,然后在处理它之前查询该弹出窗口的ViewModel中的数据。虽然这不是纯粹的MVVM,因为你的客户端ViewModel正在与弹出窗口及其ViewModel进行某些相当直接的通信,但它仍然可以工作,并且并不是大错特错。

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

我想这里可能有一些人可以指导更脱耦的方法-我也很感兴趣阅读相关资料。


是的,我的意图是让ViewModel彼此交流,就像我的帖子所说的那样,不幸的是我在标题中漏掉了那个关键词。它应该已经(现在已经)读作“windows' viewmodels”。 - michael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接