我正在构建一个 WPF 应用程序并尝试符合 MVVM 最佳实践。我正在使用MVVM Foundation框架并注意到Messenger类,我读过它应该用于处理 WPF 中的对话框。这听起来不错,但我完全不明白如何为此目的使用 Messenger。从字面上看,我要做的就是打开一个模态“关于”对话框——我不需要来回传递任何消息。
Messenger 类的意图是用于对话框需要来自其父级的消息或将消息返回给其父级的情况吗?关于对话框是否过大?将代码添加到事件处理程序以显示对话框会更好吗?
我正在构建一个 WPF 应用程序并尝试符合 MVVM 最佳实践。我正在使用MVVM Foundation框架并注意到Messenger类,我读过它应该用于处理 WPF 中的对话框。这听起来不错,但我完全不明白如何为此目的使用 Messenger。从字面上看,我要做的就是打开一个模态“关于”对话框——我不需要来回传递任何消息。
Messenger 类的意图是用于对话框需要来自其父级的消息或将消息返回给其父级的情况吗?关于对话框是否过大?将代码添加到事件处理程序以显示对话框会更好吗?
消息模式背后的想法与显示对话框没有任何关系。这个想法只是提供一种解耦的方式来在 ViewModel 之间进行通信。
您可以利用此基础架构来解决您的问题,但您必须自己实现对话框的显示。
正如 Phillip 上面展示的那样,您可以在 ViewModel 之间发送消息。当您的 ViewModel 收到消息时,它可以将自己的内部属性(例如“ShowDialog”)设置为 true。
然后,您可以拥有一个对该属性更改操作作出反应并打开一个对话框的绑定。
我还为 MVVM 模式构建了一个简单的消息传递框架,该框架借鉴了 Josh 的想法(以及其他几个现有框架),您可以在这里阅读
假设您有一个父视图和一个对话框视图。在 MVVM 中,它们都有一个视图模型。保持这些视图模型解耦是很好的,即它们之间没有相互引用。然而,他们需要相互交流。Messenger 类充当中间人或中介者,以调解两个类之间的信息通信。请参阅从Josh 的博客中获取的代码。
这是对象A。它调用中介者的Register方法实现:当我收到来自中介者的消息ObjectBSaidSomething时,我会将它缓存在成员WhatObjectBsays中。
这是对象 B,它实现: 我要发送消息 ObjectBSaidSomething。请注意,对象 B 对对象 A 一无所知。可能没有任何对象监听 ObjectBSaidSomething,或者有 100 个对象监听 ObjectBSaidSomething,但对象 B 不知道也不关心。这是很好的解耦,这就是为什么 Mediator 模式是个好主意。这就是 MVVM 基金会建议在视图模型之间传递信息的方式。