模型视图到模型视图通信

时间:2011-07-14 15:17:01

标签: architecture mvvm model-view

请问,您对以下场景的最佳(建筑质量方面)方法是什么:

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

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

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

谢谢,

0

1 个答案:

答案 0 :(得分:0)

我现在正在做这件事。

我有一个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>