我正在PluralSight的Brian Lagunas学习MVVM。
一开始,他正在撰写这两个界面:
public interface IView
{
IViewModel ViewModel {get;set;}
}
public interface IViewModel
{
IView View {get;set;}
}
我在那种模式下学习,然后他从IView中删除了ViewModel。
public interface IView {}
但我看不出它的区别,也许它的优点和缺点。 如果我把第一个例子放在哪里有什么问题吗?
答案 0 :(得分:6)
这当然是为了减少上下文留下任何有用的陈述,但乍一看界面
public interface IViewModel
{
IView View {get;set;}
}
对我来说似乎很混乱,因为MVVM模式的主要思想是ViewModel完全没有意识到View。如果您为ViewModel提供了对View的引用,那么您违反了这个想法。
答案 1 :(得分:2)
根据this blog:
- View-First:View与ViewModel有关系(通常是 通过数据绑定)。
- ViewModel-First:ViewModel创建视图(通常通过 IoC容器)。
在这两种方法中,它都呈现出视角的粘性 视图模型。而且,这两者都意味着一对一的关系 而常见的情况并非总是如此。
答案 2 :(得分:0)
好吧,我还没有看到复数课程,但我可以谈谈依赖管理。在原始方案中,你有实体A知道有关A的实体B和B.在这个意义上,有两个耦合度:A取决于B而B取决于A.虽然它们只依赖于接口,是积极的,依赖仍然存在。
通过删除其中一个依赖项,您有一个场景,其中A依赖于B,但B不依赖于,关心甚至不知道A.在原始场景中,如果您对IView或IViewModel的API进行了更改,这将是破坏性的变化。在第二种情况下,您可以对IViewModel进行任何您想要的更改,它们不会影响视图实现。
这是优势。
至于缺点,唯一的一个就是你失去了方便,但我认为这并不是一个缺点。在我的书中,任何时候你都可以最小化耦合和依赖(在合理范围内),这是一个胜利。
答案 3 :(得分:0)
我认为通过ViewModel 抽象视图的想法是完全的; ViewModel公开了必须呈现给View的任何属性以及View [实践中的用户输入]可以更改的属性(想想双向绑定)。这是绑定引擎,要注意通过PropertyChanged事件将UI与ViewModel同步;通过这种方式,ViewModel不需要引用正在使用的View,它暴露给任何视图(你想使用)一些属性......