【问题标题】:ModelView to ModelView communicationModelView 到 ModelView 通信
【发布时间】:2011-07-14 15:17:01
【问题描述】:

请问,对于以下场景,您建议(就架构质量而言)最佳方法:

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

ModelViewB (child) - 保存项目的集合。该集合在概念上属于 ModelViewB,主要在此(模型)视图中进行修改。不过ModelViewA也可以修改集合

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

谢谢,

【问题讨论】:

    标签: architecture mvvm model-view


    【解决方案1】:

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

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

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

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

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

    在执行此操作时,您可以使用多种方法来合成您的 ViewModel。您可以使用 DI 或简单的服务定位器,或者(如我所做的)在资源中定义它们。

    <Application.Resources>
        <ConsoleViewModel x:Key="ConsoleViewModel" />
        <DerpViewModel x:Key="Derp" 
            Console="{StaticResource ConsoleViewModel}" />
        <!--etc-->     
    </Application.Resources>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-21
      • 1970-01-01
      相关资源
      最近更新 更多