在MVVM模型中该模型应该实现INotifyPropertyChanged接口吗?

Sye*_*yed 57 .net wpf design-patterns mvvm inotifypropertychanged

我有清晰的思路View,并ViewModel在MVVM模式.我打算在我的应用程序中实现MVVM模式.我正面临关于模型的问题.我有.xml文件,它被解析,信息显示在视图中.

我需要第一次收到有关模型更改的通知.从需求开始我需要得到通知.

那么如何实现该模型呢?

我应该INotifyPropertyChanged在模型类中实现接口吗?(我读过该模型不应该实现INotifyPropertyChanged接口,因为它是WPF特定的)

akj*_*shi 48

INotifyPropertyChanged在模型中实现是完全可以接受的 -

通常,模型实现了可以轻松绑定到视图的工具.这通常意味着它通过INotifyPropertyChangedINotifyCollectionChanged接口支持属性和集合更改通知.表示对象集合的模型类通常派生自 ObservableCollection<T>类,该类提供INotifyCollectionChanged接口的实现 .

虽然由您来决定是否需要这种类型的实现,但请记住 -

如果您的模型类没有实现所需的接口,该怎么办?

有时候,你需要与不执行模型对象的工作INotifyPropertyChanged,INotifyCollectionChanged, IDataErrorInfo,或INotifyDataErrorInfo接口.在这些情况下,视图模型可能需要包装模型对象并将所需的属性公开给视图.这些属性的值将由模型对象直接提供.视图模型将为它公开的属性实现所需的接口,以便视图可以轻松地将数据绑定到它们.

取自 - http://msdn.microsoft.com/en-us/library/gg405484(PandP.40).aspx

我曾参与一些我们尚未INotifyPropertyChanged在模型中实施的项目,因此我们遇到了很多问题; VM中需要不必要的属性重复,同时我们必须在将它们传递给BL/DL之前更新基础对象(使用更新的值).

如果您需要处理模型对象的集合(比如在可编辑的网格或列表中)或复杂模型,您将特别遇到问题; 模型对象不会自动更新,您必须管理VM中的所有内容.

  • 是的,我并不是要恢复旧帖子,而是要确保来访的人知道使用“ IDataErrorInfo”带来的风险。我确实同意`INotifyPropertyChanged`在模型中应该是很好的(并且是首选的)-与`INotifyCollectionChanged`一样。我唯一的问题是`IDataErrorInfo`。从我的角度来看,此接口返回用户友好的错误消息(表示逻辑),这使其更适合于视图模型。我很高兴看到您的经历证实了我的新发现。:) (2认同)

Pie*_*ler 15

标准MVVM方法INotifyPropertyChanged仅在ViewModel上实现.目的是在ViewModel中发生更改时刷新View上的相应绑定.

但是,这会针对View对ViewModel 更改.也就是说,当您更改a中的值时TextBox,INotifyPropertyChangedViewModel上的实现将刷新相关的Bindings,因此View正确更新.

它并没有覆盖由外部源对模型所做,像数据库的改变或另外的接口的改变.只要所有数据修改都来自View,ViewModel应该知道所有更改并知道要更新的内容.例如,如果你知道,更改变Foo你的模型也将发生变化的价值Bar你型号,这将是明智的,同时调用OnPropertyChanged(Foo)OnPropertyChanged(Bar)当您更改的值在您的视图模型Foo.

另一种方法是使用Model和ViewModel之间的事件来刷新ViewModel上需要更新的那些值.如果,正如您所说的那样,通知是"仅限第一次",那么在某些触发器上执行手动一次性刷新也应该有效.

  • 如果我在我的ViewModel中有ObservableCollection模型,并且我想要更改这些对象怎么办?...我必须在这些模型上实现INotifyPropertychanged,然后单独制作单独的图层是没有意义的. (3认同)

Fir*_*roz 10

这是使用MVVM时非常常见的问题,INotifyPropertyChanged因为它不属于WPF,System.ComponentModel所以不需要在解决方案中添加任何WPF特定引用.

如果您将INofityPropertyChanged在模型中实现,它可以在ViewModel(代理属性)中节省更多代码.所以Model有可以接受INotifyPropertyChanged.


Kla*_*s78 9

有时,让模型实现INotifyPropertyChanged接口是可以接受的.

例如,如果模型具有许多要显示的属性,并且您希望避免在viewmodel中实现大量代码(代理属性)以公开此类模型属性.

请查看http://msdn.microsoft.com/en-us/magazine/ff798279.aspx


Mar*_*ari 3

我不确定你的意思。在 VM 中,您可能具有 、INotifyPropertyChanged或 DependencyProperty-es(在这种情况下,VM 必须派生自DependencyObject)。两者兼而有之毫无意义。没有它们也是没有意义的。

在模型中,你可以做任何你想做的事。触发/接收事件的能力很好,但并不总是你可以依赖它们。基本上,模型取决于源数据和相关内容,而视图模型具有模型与表示层的接口负载。由于 WPF 基于事件工作,因此至少VM 必须提供某种通知机制。