使用MVVM Foundation Messenger显示对话框

问题描述:

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

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

消息传递模式背后的想法并不特别与显示对话有关。这个想法只是提供ViewModels之间进行通信的解耦方式。

你可以利用这个基础设施来解决你的问题,但你必须自己实现对话框的显示。

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

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

我还建立了从Josh的想法借用MVVM模式一个简单的消息框架(和其他几个现有框架),你可以读到它here

+0

Oooohhh .....这使得很多更有意义,现在。 MyViewModel向AboutViewModel发送消息,AboutViewModel打开关于对话框。这绝对清除了我的困惑。非常感谢你。 – senfo 2009-11-25 01:09:45

+0

没问题,很高兴帮助 – 2009-11-25 01:35:24

假设您有父视图和对话框视图。在MVVM中,他们都会有一个视图模型。保持这些视图模型的解耦是很好的,也就是说它们没有彼此的引用。然而他们需要相互沟通。信使类充当中间人或调解人的角色,以调解两个类之间的信息交流。请参阅从Josh's blog获取的代码。

alt text

这里是对象A.这是调用调解员的注册方法实现:当我收到消息ObjectBSaidSomething,由调解员,我会在成员WhatObjectBSays缓存它。

alt text

这里是对象B,它实现了:我要发送消息ObjectBSaidSomething。请注意,对象B对对象A一无所知。可能不会侦听ObjectBSaidSomething,或者有100个对象侦听ObjectBSaidSomething,但对象B不知道也不在乎。这是很好的解耦,这就是为什么Mediator模式是个好主意。这就是MVVM基金会建议在视图模型之间传递信息的方式。