ViewModel与Model 之间的MVVM设计模式关系

基于MSDN的图片

在此处输入图像描述

似乎所有数据和业务逻辑都应该位于模型中,其中视图模型应具有模型的一组重复属性以用于显示目的。 View应绑定到ViewModel中的重复属性,而不是直接绑定到Models内的属性。

ViewModel应该实现INotifyPropertyChanged接口,让View知道某些属性是否被更改。

但是Model应该如何通知ViewModel有关更改? 它应该实现INotifyPropertyChanged吗? 如果是这样,那么我们可以直接将View绑定到Model的属性。 什么是在中间有一个额外的层的真正好处,我们必须手动处理所有数据更改通知?

基于我的理解的例子:
视图:

    

查看型号:

 class ViewModel : INotifyPropertyChanged { Model _m; public ViewModel(Model m) { _m = m; } public string foo { get { return _m.foo; } set { _m.UpdateFoo(value); //This one works fine. xaml will call getter to get the dead beef version PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("foo")); } } public string bar { get { return _m.bar; } } public event PropertyChangedEventHandler PropertyChanged; } 

模型:

 class Model { public string foo { get; private set; } public string bar { get; private set; } public void UpdateFoo(string newVal) { foo = newVal + "dead beef"; bar = newVal; //how do i tell ViewModel that i have changed? } } 

通知可以通过INotifyPropertyChanged来自模型; 但实际上,手动消耗界面非常糟糕 。 必须根据已更改的属性的名称建立逻辑基础并不好玩。

带有通知的模型层可能类似于消息总线客户端,因为消息进入它会对其进行解析并将相关(和强类型)事件发送到视图模型。 然后,视图模型更新其引发PropertyChanged的数据对象的属性。

对于更大的问题:您是否必须拥有单独的ViewModel和Model数据对象?

没有

如果你想成为一个纯粹主义者,当然; 复制你的对象。 如果您需要合理的方法,只需要添加特殊的视图模型对象,如果您需要添加一个不适合(或者只是不存在)模型对象的属性。

该模型更多的是关注点的分离,而不是一组无用的重复对象。 在前面的示例中,ViewModel不应该关心对象或事件来自消息总线,它只知道如何为视图设置对象。 该模型处理作为消息总线客户端的实现细节。