基本上,我不知道从哪里开始:
我有我的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通信而不知道它是谁实际上在说话。
答案 0 :(得分:7)
查看Prism中的事件聚合器。 Prism中的聚合事件旨在促进解耦,视图间模型通信。如果你想要“纯粹的”MVVM,我认为它将会是这样的:
答案 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。
我想这里有些人可以指导一种更加分离的方法 - 我也有兴趣阅读。