gpt4 book ai didi

architecture - ModelView 到 ModelView 通信

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

拜托,您对以下场景有什么建议(就架构质量而言)最好的方法:

ModelViewA(父) - 需要从 ModelViewB 收集来显示数据 - 即使集合保持不变,也可以多次访问集合

ModelViewB (child) - 持有项目的集合。该集合在概念上属于 ModelViewB,主要在此(模型) View 中进行修改。但是,ModelViewA 也可以修改集合

我目前采用的方法是在 ModelViewB 中收集并在 ModelViewA 中复制。使用消息总线(MMVM Light 工具包),我让 ModelViews 相互通知更改。但是,这感觉很尴尬,因为我保留了重复的集合并对其进行了同步。我宁愿只在一个地方拥有它,并从 ModelViewA 和 B 访问它。
我在想也许将一个 ModelView 注入(inject)另一个,但这会增加耦合并且通常感觉 MVVM 模式是错误的。我也可以只使用对两个模型 View 的静态引用,因为我有静态定位器(也来自 MVVM Light 工具包)保存引用。
或者也许有更好的解决方案?

谢谢,

最佳答案

我现在(有点)正在这样做。

我有一个 ConsoleViewModel,它记录和存储来自执行的事件,以便在我的 ConsoleView 的 UI 中显示。自然地,我的 ViewModels 希望与这个控制台通信以记录他们的事件。

为了做到这一点,我创建了一个接口(interface),它公开了我的 ViewModel 可以用来将其事件写入控制台的方法。

public interface IConsole
{
void Info(string message);
void Info(string messageFormat, params object[] args)
// etc
}

我的 ConsoleViewModel 实现了这个接口(interface),所有其他 ViewModel 都公开了一个 IConsole 类型的公共(public)属性,它们用来写入控制台。

在此过程中,您可以使用多种方法来合成您的 ViewModel。您可以使用 DI 或简单的服务定位器,或者(如我所做的)在资源中定义它们。
<Application.Resources>
<ConsoleViewModel x:Key="ConsoleViewModel" />
<DerpViewModel x:Key="Derp"
Console="{StaticResource ConsoleViewModel}" />
<!--etc-->
</Application.Resources>

关于architecture - ModelView 到 ModelView 通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6695599/

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