我之前从未使用过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
感谢
答案 0 :(得分:12)
差异非常简单。
模型具有业务逻辑 视图模型包含表示逻辑,并且还可以根据视图进行整形。
在您的情况下 - 视图模型实现INotifyPropertyChanged
。这是纯粹的表达逻辑。
模型不负责通知某个特定用户界面有变更,负责转移发票,计算工资等。
有时(当模型很简单时),这种抽象不是必需的。
一些wiki引言:
模型:与经典MVC模式一样,模型指的是任何一个
(a)表示真实状态内容的对象模型(面向对象的方法)或
(b)代表该内容的数据访问层(以数据为中心的方法)。
ViewModel :ViewModel是一个“视图模型”,意味着它是一个抽象的视图,它也用于视图和模型之间的数据绑定。它可以被视为控制器(在MVC模式中)的一个专门方面,它充当数据绑定器/转换器,将模型信息更改为视图信息并将命令从视图传递到模型中。 ViewModel公开公共属性,命令和抽象。 ViewModel已被比作数据的概念状态,而不是模型中数据的实际状态。
答案 1 :(得分:10)
这是所有MV [x]架构背后的一般概念,尽管是MVC,MVP或MVVM:
ObservableCollection
')以及用户表示(例如,考虑不同的日期排序或不同语言的不同小数点)。在您的简单示例中,这可能看起来有点过分,但正常的商业软件将有数十甚至数百个这样的MV [x]三元组,如果没有这个,您将无法维护一个干净的架构。
回答你的问题:你的例子中只有一些布线代码来设置所描述的架构。
HTH! 托马斯
答案 2 :(得分:5)
ObservableCollection
会在列表中添加或删除项目时通知,但如果您希望在这些属性发生更改时发生通知,则需要ItemViewModel上的INotifyPropertyChanged
。