gpt4 book ai didi

wpf - 使用 MVVM Light Toolkit 在绑定(bind) ViewModel 属性或消息传递之间进行选择以在 ViewModel 和 View 之间进行通信

转载 作者:行者123 更新时间:2023-12-03 10:22:01 24 4
gpt4 key购买 nike

我正在使用 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 会为我处理这些。但是,当我在 View 中使用它们时,我必须在关闭时明确取消注册它们,如下所示:
Messenger.Default.Unregister(this);

我想我可以为 Views 实现一个基类来继承。

但是,让我感到震惊的是,在 View 中使用 Messenger 可能是一种代码味道……它可以工作,但它可能不是最好的方法。我想知道是否应该在 ViewModel 上创建一个属性并将 View 元素的任何部分绑定(bind)到它。在隐藏表单的示例中,属性可以是一个名为“Show”的 bool 值。当我考虑它时,我可以看到在许多情况下这将导致必须编写一个 ValueConverter。一种方法似乎不太可测试。另一种方式似乎需要更多的代码,并且可能需要引入多余的 ValueConverters,这可能会成为代码本身的味道。

所以(在所有这些积累之后)我的问题是:

是在 View 中使用消息更可取,还是添加属性(可能还有 ValueConverters)以允许 ViewModel 以更可绑定(bind)的方式驱动它更好?

最佳答案

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

关于wpf - 使用 MVVM Light Toolkit 在绑定(bind) ViewModel 属性或消息传递之间进行选择以在 ViewModel 和 View 之间进行通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4002667/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com