【问题标题】:MVVM Dependencies between View and ViewModelView 和 ViewModel 之间的 MVVM 依赖关系
【发布时间】:2010-10-21 08:09:08
【问题描述】:

目前 MVVM 设计模式有很多变体,但据我了解,允许视图依赖于视图模型。我的一位同事不同意,但他无法提供令人满意的解释。

例如我的视图包含对其视图模型的引用。这不是所有视图都需要的,但它有助于将某些事件传达给无法通过 ICommand 完成的视图模型。

有这种依赖关系可以吗?有什么缺点?

【问题讨论】:

    标签: .net wpf design-patterns mvvm


    【解决方案1】:

    仅通过数据绑定进行耦合确实很好,但有时视图需要的不仅仅是来自视图模型的命令和属性。我有一个视图需要响应视图模型中的事件,而这些事件不能被路由事件。所以这个视图需要一个对其视图模型的引用。

    我认为视图尝试将其 DataContext(通常在 DataContextChanged 事件内部)转换为正确的接口类型是一个好主意。这样,视图仍然可以通过数据模板和其他 XAML 进行初始化。如果强制在构造函数中传递接口,则必须在代码中创建视图。

    【讨论】:

      【解决方案2】:

      主要指标是:你能测试一下吗?

      视图绝对需要对视图模型的引用。否则它将如何获得显示自身所需的信息?通常只在视图的DataContext 中有视图模型就足够了,但这仍然构成依赖关系。如果没有DataContext 中的VM,视图将毫无用处。

      有时您需要视图来回调虚拟机。通常我只是在后面的代码中这样做:

      public MyViewModel ViewModel
      {
          get { return DataContext as MyViewModel; }
      }
      
      private void _someEventHandler(object sender, EventArgs )
      {
          ViewModel.SomeMethod();
      }
      

      从视图模型中保存对视图的引用是您需要小心的地方。如果 VM 依赖于特定的视图实现,则它与视图紧密耦合,因此难以测试。

      如果 VM 需要以某种方式与视图交互,您可以将需求抽象为一个接口并让视图实现该接口。然后,当视图加载时,它可以为 VM 提供对自身的引用,VM 可以与之交互。

      【讨论】:

      • Kent 建议通过接口进行对话的原因是您可以模拟它以进行测试。您可以创建一个虚拟视图来实现此接口以进行测试。
      • 但是如果 view 引用了 vm,那么 view 也与 viewmodel 紧密耦合。
      猜你喜欢
      • 2011-09-05
      • 1970-01-01
      • 2018-06-03
      • 1970-01-01
      • 2016-09-10
      • 2010-11-18
      • 1970-01-01
      • 1970-01-01
      • 2021-12-21
      相关资源
      最近更新 更多