MVVM - Model和ViewModel之间的区别

Bra*_*rap 9 c# silverlight mvvm windows-phone-7

我之前从未使用过MVVM,所以我可能会遗漏一些明显的东西.当我创建一个新的Panorama应用程序时,已经有一个包含ItemViewModel和MainViewModel的ViewModel文件夹.

我认为"MainViewModel.cs"是组织全景图的文件.但是,在MainViewModel中,它有以下行:

public MainViewModel()
{
    this.Items = new ObservableCollection<ItemViewModel>();
}
Run Code Online (Sandbox Code Playgroud)

ItemViewModel与全景图没有交互.然后将这些实例化为:

this.Items.Add(new ItemViewModel() 
{ 
    LineOne = "first line", 
    LineTwo = "second line", 
    LineThree = "third line" 
});
Run Code Online (Sandbox Code Playgroud)

为什么ItemViewModel不是一个'模型'?它实现了INotifyPropertyChanged,但出于什么目的?我会认为MainViewModel中的ObservableCollection足以通知任何更改,如此处所示

谢谢

Arn*_*psa 13

差异很简单.

模型持有业务逻辑.
视图模型包含表示逻辑,并且还经过整形以适合视图.

在您的情况下 - 视图模型实现INotifyPropertyChanged.这是纯粹的表达逻辑.

模型不负责通知某个特定的UI有什么变化,它负责转移发票,计算工资等.

有时(当模型很简单时),这种抽象不是必需的.


一些维基报价:

模型:与经典MVC模式一样,模型指的是
(a)表示真实状态内容的对象模型(面向对象的方法),或
(b)表示该内容的数据访问层(数据 -中心方法).

ViewModel:ViewModel是一个"视图模型",意味着它是View抽象,也用于View和Model之间的数据绑定.它可以被视为控制器(在MVC模式中)的一个专门方面,它充当数据绑定器/转换器,将模型信息更改为视图信息并将命令从视图传递到模型中.ViewModel公开公共属性,命令和抽象.ViewModel被比作数据的概念状态,而不是模型中数据的真实状态.


Tho*_*ler 11

它是所有MV [x]架构背后的一般概念,尽管是MVC,MVP或MVVM:

  • 你有一个模型,这基本上是你的业务领域的软件抽象.它不知道也不关心任何与UI相关的东西(例如在你的情况下'通知UI有关变化').它实现了业务逻辑,就是这样.
  • 另一方面,您有UI,具有技术术语的特定需求(例如'WPF想要绑定到ObservableCollection')以及用户表示(例如,考虑不同日期顺序或不同语言的不同小数点).
  • 为了解决这个问题并且能够在干净的架构中清楚地区分这些要求,您需要[x],在您的情况下是ViewModel.它是软件中唯一知道UI和模型的层.否则,两者之间应该没有任何联系.

在您的简单示例中,这可能看起来有点过分,但普通的商业软件将拥有数十甚至数百个这样的MV [x]三元组,如果没有这个,您就无法维护一个干净的架构.

回答你的问题:你的例子中只有一些布线代码来设置所描述的架构.

HTH!托马斯


Rob*_*cus 6

ObservableCollection当项目被添加或从列表中删除,但会通知INotifyPropertyChanged,如果你想通知当这些属性发生改变的ItemViewModel是必要的.