【问题标题】:In MVVM, who's responsibility is it to control creation of new Views (the current View, or its ViewModel)?在 MVVM 中,谁负责控制新视图(当前视图或其 ViewModel)的创建?
【发布时间】:2011-06-12 18:53:15
【问题描述】:

场景:
- 应用加载 ViewA 及其关联的 ViewModelA。
-ViewA 有一个按钮,该按钮将命令绑定到 ViewModelA 上的命令。
-ViewModelA 处理命令,应创建并显示 ViewB 的实例。

问题是,谁应该负责创建 ViewB 的实例?

ViewModel 不应该对视图一无所知似乎是合理的,所以我看到了一些可行的可能性:

1) ViewModelA 可以设置一个由 ViewA 监控的属性,以便 ViewA 知道创建 ViewB 的实例。但这似乎会让 ViewA 承担太多责任。

2)您可以将某种 ViewManager 服务注入 ViewModelA,当它处理来自 ViewA 的命令时,它可以使用 command 参数将某种适当的元数据传递给 ViewManager 的 LoadView(metadata) 方法。

【问题讨论】:

    标签: view viewmodel mvvm


    【解决方案1】:

    看看arconaut的answer(即使当时不是公认的答案,这似乎是最干净的方法:

    • 在您的 ViewModel 中,使用某种 Mediator 模式(或类似 EventAggregator 的东西)“发布”一条 CreateView 消息
      • 在某处有一个类,称为 ViewManager,其职责是订阅所有 CreateView 消息,并实例化相应的视图

    这几乎就像你的第二个提案,只是更松散耦合。

    【讨论】:

    • 这听起来确实像我要采用的解决方案。我正在考虑将我的应用程序分解为不同的方面或功能(即登录方面、用户管理方面、客户管理方面等)。应用程序的每个方面都有自己的 AspectController 对象,其工作将是初始化和管理与应用程序的该方面相关的视图/视图模型。它将侦听显示不同视图的请求,并确定是否/如何初始化和显示请求的视图。
    • 这意味着 LoginAspectController 将初始化并显示 LoginView/LoginViewModel,当用户单击“重置密码”按钮时,该命令将由 LoginViewModel 处理并发出请求重置密码视图/重置密码视图模型。 LoginAspectController 会适当地接收和处理请求。
    • 我不确定“AspectController”是否是正确的称呼,或者是否有更好的名字。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-28
    • 2017-01-04
    • 1970-01-01
    • 2012-09-20
    相关资源
    最近更新 更多