代码之家  ›  专栏  ›  技术社区  ›  Dan Bryant

MVVM:如何处理嵌套视图模型之间的交互?

  •  18
  • Dan Bryant  · 技术社区  · 16 年前

    ContentTemplateSelector ),这取决于所连接的特定类型的控制器。此控件有自己的ViewModel。

    我的一般问题是:ViewModels应该如何相互作用,特别是当一个“父”VM需要一个“子”VM的帮助以便知道该怎么做时,是否有任何普遍接受的设计模式?


    编辑:

    我确实想出了一个比我原来想的更简洁的设计,但我仍然不确定这样做是否“正确”。我有一些后端服务,允许ContentTemplateSelector查看控制器实例,并伪魔术般地找到一个控件以显示连接生成器。困扰我的是,我的顶级ViewModel必须查看 DataContext 数据上下文 与创建连接有关吗?)

    我最终得到了这样的结果(简化):

    public interface IController
    {
        IControllerConnectionBuilder CreateConnectionBuilder();
    }
    
    public interface IControllerConnectionBuilder
    {
        ControllerConnection BuildConnection();
    }
    

    我有我的内部ViewModel类实现 IControllerConnectionBuilder 控制器返回内部ViewModel。然后,顶级ViewModel将其可视化 IControllerConnectionBuilder

    我欢迎有更多的想法,如果有办法进一步清理这个问题。我仍然不清楚ViewModel有多少责任。

    3 回复  |  直到 10 年前
        1
  •  3
  •   Bermo    16 年前

    observer 位于viewmodel类之间的类。

        2
  •  3
  •   Leon Breedt    16 年前

    我想你想成为你的顶级 ViewModel NestedViewModel ,从分层的角度来看,主视图包含子视图是有意义的。

    在我看来,您的直觉是对的,嵌套的ViewModel暴露由顶级用户操作发起的行为是不正确的。相反,最高层 应该为与其关联的视图提供行为。

    但我会考虑把连接建设的责任转移到 ICommand ,并通过顶级 视图模型 视图模型 ,例如,呼叫 ViewModel.CreateConnection()

    嵌套控件的职责就是收集数据,并将其暴露给其他控件 ,供用户使用 ,并且理论上它在不同的上下文中更可重用,这些上下文要求输入相同的信息(如果有的话)-假设您想将其重新用于编辑已经创建的连接。

    公开一组完全不同的数据。

    主机名 和 作为属性,另一个暴露 用户名 和 密码 .

    ViewModel.CreateConnection() 仍然以干净的方式工作。尽管您有少量的嵌套控件类型,但这可能不值得付出努力,而且 类型检查和铸造可能就足够了。

    这听起来可行吗?

        3
  •  0
  •   Sascha    16 年前

    HTH公司