view - 在 MVVM 中,谁负责控制新 View (当前 View 或其 ViewModel)的创建?

标签 view viewmodel mvvm

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

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

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

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

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

最佳答案

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

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

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

    关于view - 在 MVVM 中,谁负责控制新 View (当前 View 或其 ViewModel)的创建?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4753017/

    相关文章:

    wpf - Caliburn.Micro:将屏幕中的按钮绑定(bind)到 ScreenConductor 中的命令

    c# - 使用 EF 保存后在 MutliSelectComboBox 中显示项目集合的问题

    ruby-on-rails - 如何从 Rails 中的索引更新记录

    java - Android 创建显示 View

    java - Android,从代码调用 View 对象

    Android Lollipop 定时器(持续时间)输入

    design-patterns - 我缺少哪个应用程序层?

    android - Unresolved reference : viewModels()

    c# - ViewModel 可以具有 IEnumerable<> 类型的属性而不是 Array

    asp.net-mvc - 将对象的 knockout 数组传递给 mvc Controller 操作