我已经完成了一些MVVM教程,我已经看到了这两种方式.大多数人使用ViewModel for PropertyChanged(这是我一直在做的),但我遇到了一个在模型中做到这一点.两种方法都可以接受吗 如果是这样,不同方法的好处/缺点是什么?
Jon*_*len 33
微软的模式和实践,MVVM的发明者,我都不同意所选择的答案.
通常,模型实现了可以轻松绑定到视图的工具.这通常意味着它通过INotifyPropertyChanged和INotifyCollectionChanged接口支持属性和集合更改通知.表示对象集合的模型类通常派生自ObservableCollection类,该类提供INotifyCollectionChanged接口的实现.
- Microsoft模式和实践:http://msdn.microsoft.com/en-us/library/gg405484%28v=pandp.40%29.aspx#sec4
此时数据绑定开始发挥作用.在简单示例中,View是直接绑定到Model的数据.模型的各个部分通过单向数据绑定简单地显示在视图中.可以通过直接将控件双向绑定到数据来编辑模型的其他部分.例如,Model中的布尔值可以是绑定到CheckBox的数据,也可以是绑定到TextBox的字符串字段.
- MVVM的发明者John Gossman:http://blogs.msdn.com/b/johngossman/archive/2005/10/08/478683.aspx
我自己的文章:http://www.infoq.com/articles/View-Model-Definition
具有"视图模型"的反模式只是包装模型并公开相同的属性列表.视图模型的工作是调用外部服务并公开这些服务返回的个体和模型集合.
原因:
这并不是说你永远不需要一个包装模型的视图模型.如果您的视图模型公开了与模型明显不同的属性,并且不能仅使用IValueConverter进行包装,那么包装视图模型是有意义的.
您可能需要包装视图模型的另一个原因是您的数据类由于某种原因不支持数据绑定.但即便如此,通常最好只创建一个普通的可绑定模型并从原始数据类中复制数据.
当然,您的视图模型将具有UI特定属性,例如当前选择集合中的哪个项目.
Mar*_*tus 16
的INotifyPropertyChanged(INPC)接口用于Binding.
所以,在一般情况下,你想在你的实现它ViewModel.
该ViewModel用于解耦Model从你的View,所以没有必要有INPC在你的Model,因为你不希望Bindings你的Model.
在大多数情况下,即使是较小的房产,您仍然只有很小的房产ViewModel.
如果你想要一个坚实的基础MVVM,你可能会使用某种MVVM框架,如caliburn.micro.使用它将为您提供ViewModelBase(或此处NotifyPropertyChangedBase),这样您就不必自己实现这些接口成员,只需使用NotifyOfPropertyChange(() => MyProperty),这样更容易,更不容易出错.
更新 由于似乎有许多Windows窗体开发人员,这里有一篇很好的文章,将更深入地了解MVVM的内容: MVVM上的MSDN杂志
我特别关注了关于数据模型的部分,问题是关于.
绝对同意乔纳森·艾伦的观点。
如果您没有任何内容可以添加到您的“视图模型”(命令、影响演示文稿的特定于视图的属性等),那么我肯定会在模型中实现 INotifyPropertyChanged 并直接公开它(如果可以的话 - “模型”可能不会)成为你的)。您不仅最终会重复大量样板代码,而且保持两者同步绝对是一件痛苦的事情。
INotifyPropertyChanged 不是特定于视图的接口,它仅执行其名称所暗示的功能 - 在属性更改时引发事件。WinForms、WPF 和 Silverlight 恰好支持它进行绑定 - 我当然将它用于非演示目的!