我正在使用MVVM Light工具包(我喜欢)。我目前有来自ViewModel的一些交互的消息传递,供View使用。通常,这些类型的消息表明View应该执行类似隐藏的操作,显示保存数据的确认消息等。
这很有效。在View的构造函数中,我使用Messenger注册:
Messenger.Default.Register<NotificationMessage<PaperNotification>>(this, n => HandlePaperNotification(n));
当我使用Messenger来传达ViewModel之间的横切关注(如身份)时,我可以看到,当ViewModel在ViewModelLocator中被清理时,ViewModel的基类(ViewModelBase)会取消注册所有订阅的消息。我不需要做任何事情,因为MVVM Light Toolkit会为我处理。但是,当我在视图中使用它们时,我必须在关闭时明确地注销它们,如下所示:
Messenger.Default.Unregister(this);
我想我可以为要继承的Views实现一个基类。
然而,令我印象深刻的是,这可能是在视图中使用Messenger的代码气味...它可以工作,但它可能不是最好的方法。我想知道是否应该在ViewModel上创建一个属性,并将View的元素的任何部分绑定到它。在隐藏表单的示例中,属性可以是名为“Show”的布尔值。在我考虑它时,我可以看到,在许多情况下,这将导致必须编写ValueConverter。一种方式似乎不太可测试。另一种方式似乎需要更多的代码,也许需要引入过多的ValueConverters,这可能会成为代码气味。
所以(在所有构建之后)我的问题是:
是否最好在View中使用消息,还是更好地添加属性(以及可能的ValueConverters)以允许ViewModel以更可绑定的方式驱动它?
答案 0 :(得分:3)
在MVVM中。 ViewModel通过DataBinding和Commands与View通信。如果您需要其他功能,则需要使用此方法实现它。 消息传递应该仅适用于ViewModels。视图应该是ViewModel中数据的“愚蠢”可视化器。
答案 1 :(得分:1)
MVVM Light中的消息传递逻辑用于ViewModels之间的通信。我从来没有遇到View和ViewModel之间的任何通信,我无法用绑定和/或命令解决。有时我需要Value Converters,有时我需要代码隐藏中的代码,但我从来没有必要让ViewModel直接将数据推送到View。
答案 2 :(得分:0)
这是一个有趣的讨论,当我想知道视图模型来查看通信时,我找到了这个帖子。有趣的是,MVVMLight的创建者似乎完全找到它acceptable to send messages from a view model to a view。关于什么是好MVVM设计的另一个不同意见的例子。