【问题标题】:Choosing between bound ViewModel properties or messaging to communicate between ViewModel and View using the MVVM Light Toolkit使用 MVVM Light Toolkit 在绑定 ViewModel 属性或消息传递之间进行选择以在 ViewModel 和 View 之间进行通信
【发布时间】: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&lt;NotificationMessage&lt;PaperNotification&gt;&gt;(this, this.HandlePaperNotification);

标签: wpf mvvm mvvm-light


【解决方案1】:

在 MVVM 中。 ViewModel 通过 DataBinding 和 Commands 与 View 通信。如果你需要一些其他的功能,你需要使用这种方式来实现它。 消息传递应该仅适用于 ViewModel。视图应该是 ViewModel 中数据的“愚蠢”可视化工具。

【讨论】:

  • 我想我同意,但是您如何处理诸如确认消息之类的事情?如果 ViewModel 关闭并调用服务来保存数据,然后想要转发服务成功保存它的确认消息......该机制如何在完全哑 View 的情况下工作?我应该有一个默认为空的状态属性吗?
  • 什么样的确认?消息框? MVVM 中有关于 MessageBoxes 的完整线程。它是视图中的某种文本或视觉表示吗?为什么不使用 DataBinding?
  • 是的....消息框。快速搜索给我带来了几个关于在 MVVM 中使用 MessageBoxes 的主题。谢谢。
【解决方案2】:

MVVM Light 中的消息传递逻辑用于 ViewModel 之间的通信。我从来没有遇到过 View 和 ViewModel 之间无法通过绑定和/或命令解决的任何通信。有时我需要值转换器,有时我需要代码隐藏中的代码,但我从来不需要让 ViewModel 直接将数据推送到 View。

【讨论】:

  • 谢谢斯科特...如果我能把答案分开的话。
【解决方案3】:

这是一个有趣的讨论,当我想知道视图模型与视图通信时,我发现了这个线程。有趣的是,MVVMLight 的创建者似乎完美地发现了它acceptable to send messages from a view model to a view。另一个关于什么是好的 MVVM 设计存在不同意见的例子。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-10
    • 2019-07-11
    • 1970-01-01
    • 1970-01-01
    • 2015-12-19
    • 1970-01-01
    • 2011-01-21
    • 2013-10-02
    相关资源
    最近更新 更多