【发布时间】:2010-10-23 05:37:36
【问题描述】:
我正在使用 MVVM Light 工具包(我喜欢它)。我目前有一些来自 ViewModel 并打算由 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 以更可绑定的方式驱动它更好?
【问题讨论】:
-
你可以在 wat 旁边
Messenger.Default.Register<NotificationMessage<PaperNotification>>(this, this.HandlePaperNotification);做
标签: wpf mvvm mvvm-light