gpt4 book ai didi

wpf - MVVM:ViewModel 的松散耦合

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

我有类(class),A,B,C,D

A 引用了 E 和 B 以及 C 和 D 的列表。

在 AViewModel 中,这些暴露在树中。

A 的 View 如图所示。

enter image description here

当一个节点被选中时,应该显示一个对应的 View 。

有 E、B、C 和 D 的 ViewModel

我的问题如下:

例如 E 是选定的节点。我将它作为“对象 SelectedItem”存储在 AViewModel 中。
以松散耦合的方式创建 EViewModel 的最佳方法是什么,这样我就不想在 AViewModel 中引用 EViewModel。

更新:

我正在考虑一种解决方案,但我从未在其他地方看到过:

例如,我只能从 AViewModel 公开我的 POCO(B、C、D、E)。在 XAML 中,我可以将 ContentControl 直接绑定(bind)到这些对象。使用转换器,当我绑定(bind)到 B 时,我可以有一个 BViewModel 等等。

最佳答案

在 MVVM 应用程序中以松散耦合的方式在 View 模型和其他组件之间进行通信的一种常见且被广泛接受的方式是使用事件聚合器或信使。请参阅以下链接了解更多信息。

使用事件聚合器模式在 View 模型之间进行通信: https://blog.magnusmontin.net/2014/02/28/using-the-event-aggregator-pattern-to-communicate-between-view-models/

MVVM - MVVM 中的 Messenger 和查看服务: https://msdn.microsoft.com/en-us/magazine/jj694937.aspx .

另一种选择是使用您注入(inject) View 模型的共享服务:https://social.msdn.microsoft.com/Forums/en-US/22907a0f-d805-4195-8272-7c284b72d2ee/example-of-using-shared-services-prism?forum=wpf

使用事件聚合器、信使或共享服务意味着您可以删除 View 模型类之间的所有引用。

每个 View 模型只知道一个事件聚合器/信使/共享服务,并且只与这个服务通信,而不是 View 模型类来回相互强引用。 View 模型 A 可以发送任意数量的消息,任何其他 View 模型可以订阅以在内部收听和处理。

My question is about best practices on topic of creating an instance of a ViewModel without having a tight coupling, not about the communication between loosely coupled ViewModels



在不创建字符串耦合的情况下创建另一个 View 模型的实例是不可能的。如果一个 View 模型创建另一个 View 模型的实例,则它们根据定义是强耦合的。为了防止这种情况,您可以注入(inject)具有其他 View 模型实现的接口(interface)类型的 View 模型,例如:
public ViewModelB(IViewModelA viewModelA)
{
//...
}

然后 ViewModelB 依赖于接口(interface)类型而不是 ViewModelA 的具体实现。这比做这样的事情要好一点,因为这样 ViewModelA 和 ViewModelB 将总是 - 如上所述 - 彼此强耦合:
public ViewModelB()
{
_viewModelA = new ViewModellA();
}

但是,如果您真的关心 View 模型类之间的松散耦合,则应该摆脱直接引用并开始使用事件聚合器或信使在它们之间进行通信。

关于wpf - MVVM:ViewModel 的松散耦合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41759067/

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