MVVM - Model和ViewModel之间的区别

时间:2010-09-29 14:13:33

标签: c# silverlight mvvm windows-phone-7

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

我认为“MainViewModel.cs”是组织全景图的文件。但是,在MainViewModel中,它有这一行:

    public MainViewModel()
    {
      this.Items = new ObservableCollection<ItemViewModel>();
    }

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

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

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

感谢

3 个答案:

答案 0 :(得分:12)

差异非常简单。

模型具有业务逻辑 视图模型包含表示逻辑,并且还可以根据视图进行整形。

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

模型不负责通知某个特定用户界面有变更,负责转移发票,计算工资等。

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


一些wiki引言:

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

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

答案 1 :(得分:10)

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

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

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

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

HTH! 托马斯

答案 2 :(得分:5)

ObservableCollection会在列表中添加或删除项目时通知,但如果您希望在这些属性发生更改时发生通知,则需要ItemViewModel上的INotifyPropertyChanged