什么是MVVM VIEW优先的方法

本文关键字:方法 VIEW MVVM 什么 | 更新日期: 2023-09-27 18:21:16

我正在PluralSight的Brian Lagunas的一门课程中学习MVVM。

一开始,他编写了这两个界面:

public interface IView
{
    IViewModel ViewModel {get;set;}
}
public interface IViewModel
{
    IView View {get;set;}
}

我在那个模式下学习,然后他从IView中删除了ViewModel。

public interface IView {}

但我看不出它有什么不同,也许它有优点也有缺点。如果我举第一个例子,有什么不对吗?

什么是MVVM VIEW优先的方法

这当然是为了减少上下文,留下任何有用的语句,但第一眼看到的是接口

public interface IViewModel 
{
    IView View {get;set;}
}

对我来说似乎很困惑,因为MVVM模式的主要思想是ViewModel完全不知道View。如果您为ViewModel配备了对视图的引用,则您违反了这一想法。

根据这个博客:

  • 视图优先:视图与其ViewModel(通常通过数据绑定)
  • ViewModel First:ViewModel创建视图(通常通过IoC容器)

在这两种方法中,它都对视图模型。此外,这两者都意味着一对一的关系虽然常见的情况并非总是如此。

嗯,我还没有看过复数形式的课程,但我可以大致谈谈依赖关系管理。在最初的方案中,实体A知道实体B,B知道A。在这个意义上,有两个耦合度:A依赖于B,B依赖于A。虽然它们只依赖于接口,这是积极的,但这种依赖仍然存在。

通过删除其中一个依赖项,您将得到一个场景,其中a依赖于B,但B不依赖、不关心甚至不知道a。在原始场景中,如果您对IView或IViewModel的API进行更改,这些更改将是破坏性的更改。在第二个场景中,您可以对IViewModel进行任何更改,这些更改不会影响视图实现。

这就是优势。

至于缺点,唯一的缺点是你失去了便利,但我认为这并不是真正的缺点。在我的书中,任何时候你都可以(在合理的范围内)最小化耦合和依赖,这就是胜利。

我认为这一切都是关于通过ViewModel抽象视图的想法;ViewModel公开了必须呈现给View的任何属性,以及View[实践中的用户输入]可以更改的属性(考虑双向绑定)。它是绑定引擎,负责通过PropertyChanged事件将UI与ViewModel同步;通过这种方式,ViewModel不需要引用正在使用的视图,它会向任何视图(您想要使用)公开一些属性。。。