使用MVVM Foundation Messenger显示对话框

时间:2009-11-24 20:45:34

标签: wpf mvvm dialog mvvm-foundation messenger

我正在构建一个WPF应用程序并尝试符合MVVM最佳实践。我正在使用MVVM Foundation框架并注意到Messenger类,我读过这个类应该用于handling dialogs in WPF。这听起来很棒,但我完全不了解如何使用Messenger来实现此目的。从字面上看,我想做的就是打开一个模态关于对话框 - 我不需要来回传递任何消息。

Messenger类的目的是用于对话框需要来自其父级的消息,还是将消息返回给其父级的情况?关于对话框是否有点过分?如果只是将代码添加到事件处理程序以显示对话框,我会更好吗?

2 个答案:

答案 0 :(得分:5)

消息传递模式背后的想法与显示对话框没有任何关系。这个想法只是提供一种在ViewModels之间进行通信的解耦方式。

您可以利用此基础架构来解决您的问题,但您必须自己实现对话框的显示。

正如Phillip所示,您可以在ViewModels之间发送消息。当您的ViewModel收到消息时,它可以将其自己的内部属性(例如“ShowDialog”)设置为true。

然后,您可以拥有一个对此属性更改操作做出反应的绑定,并打开一个对话框。

我还为MVVM模式构建了一个简单的消息传递框架,借鉴了Josh的想法(以及其他一些现有的框架),你可以阅读它here

答案 1 :(得分:3)

假设您有父视图和对话视图。在MVVM中,他们都有一个视图模型。保持这些视图模型解耦是很好的,即它们没有相互引用。但他们需要相互沟通。 Messenger类充当介于两者之间的调解器或介体来调解两类之间的信息通信。请参阅Josh's blog中的代码。

alt text

这是对象A.它调用mediator的Register方法实现:当我收到消息ObjectBSaidSomething时,我将把它缓存在成员WhatObjectBSays中。

alt text

这是Object B,它实现:我将发送一条消息ObjectBSaidSomething。注意,对象B对Object A一无所知。可能没有任何东西正在侦听ObjectBSaidSomething,或者100个对象正在侦听ObjectBSaidSomething,但是对象B不知道也不关心。这是很好的解耦,这就是Mediator模式是一个好主意的原因。这就是MVVM基金会建议在视图模型之间传递信息的方式。