在MVVM模型中,模型应该实现INotifyPropertyChanged接口吗?
我对MVVM模式下的View
和ViewModel
有清晰的认识。 我打算在我的应用程序中实现MVVM模式。 我正面临一个关于模型的问题。 我有.xml文件parsing并显示在视图上的信息。
我只需要第一时间通知模型的变化。 从需求开始,我需要得到通知。
那么如何实现这个模型?
我应该在模型类中实现INotifyPropertyChanged
接口吗? (我读的模型不应该实现INotifyPropertyChanged
接口,因为它是特定于WPF)
在模型中实现INotifyPropertyChanged
是完全可以接受的 –
通常情况下,模型实现了便于绑定到视图的function。 这通常意味着它通过
INotifyPropertyChanged
和INotifyCollectionChanged
接口支持属性和集合更改通知。 表示对象集合的模型类通常来自ObservableCollection<T>
类,它提供了INotifyCollectionChanged
接口的实现。
虽然由您来决定是否需要这种types的实现,但请记住 –
如果你的模型类没有实现所需的接口呢?
有时您需要使用不实现
INotifyPropertyChanged
,INotifyCollectionChanged
,IDataErrorInfo
或INotifyDataErrorInfo
接口的模型对象。 在这些情况下,视图模型可能需要包装模型对象并将所需的属性暴露给视图。 这些属性的值将由模型对象直接提供。 视图模型将为其公开的属性实现所需的接口,以便视图可以轻松地将数据绑定到它们。
取自 – http://msdn.microsoft.com/zh-cn/library/gg405484(PandP.40).aspx
我曾经在一些项目中工作过,在我们的模型中没有实现INotifyPropertyChanged
,因此我们遇到了很多问题。 在虚拟机中需要不必要的属性重复,同时我们必须在将它们传递给BL / DL之前更新底层对象(具有更新的值)。
如果您需要处理收集模型对象(比如可编辑的网格或列表)或复杂的模型,您将面临特别的问题; 模型对象将不会自动更新,您将不得不pipe理虚拟机中的所有内容。
标准的MVVM方法是只在ViewModel上实现INotifyPropertyChanged
。 目的是在ViewModel中的某些内容发生变化时刷新视图上的适当绑定。
但是,这个目标是通过视图改变ViewModel 的 。 也就是说,当您更改TextBox
的值时,ViewModel上的INotifyPropertyChanged
实现将刷新相关的绑定,以便View正确更新。
它不包括外部来源对模型所做的更改,如数据库更改或其他界面。 只要所有数据修改都来自视图,ViewModel应该知道所有的变化,并知道要更新什么。 例如,如果您知道在模型上更改variablesFoo
也会更改模型上的Bar
的值,那么在更改Foo
的值时,在ViewModel中调用OnPropertyChanged(Foo)
和OnPropertyChanged(Bar)
。
另一种方法是使用Model和ViewModel之间的事件来刷新ViewModel上需要更新的值。 如果像你说的那样,通知是“仅第一次”需要的,那么在一些触发器上刷新一次手册也应该工作。
这是使用MVVM时非常常见的问题, INotifyPropertyChanged
不是WPF特有的,因为它是System.ComponentModel
一部分,因此不需要在您的解决scheme中添加任何WPF特定的引用。
如果你在模型中实现INofityPropertyChanged
,它可以在ViewModel(代理属性)中保存更多的代码。 所以模型有INotifyPropertyChanged
是可以接受的。
有时模型实现INotifiyProperyChanged
是可以接受的。
例如,如果模型具有很多可视化的属性,并且您希望避免在视图模型中实现大量的代码(代理属性)以暴露此类模型属性
我不确定你的意思。 在VM中,您可能有INotifyPropertyChanged
或DependencyProperty-es(在这种情况下,VM必须从DependencyObject
派生)。 两者都没有意义。 也没有任何意义。
在模型中,你可以做任何你想做的事情。 发射/接收事件的能力是好的,但并不总是你可以依靠它们。 基本上模型是取决于源数据和相关的东西,而视图模型负责与表示层的模型接口。 由于WPF在事件上工作, 至less VM必须提供一些通知机制。
这是“纯”MVVM编码器和其他编码器之间的经典争论。
我倾向于随时读书,因为大部分时间都是有道理的。 但是,在某些情况下,根据需要即兴编码可以减less大量的重复编码。
在你的情况下,你可以将XML读取到模型类,并将模型类的副本复制到视图模型中,或者将需要从模型中获得的属性复制到视图模型中。 这样你可以控制更新UI /模型。 如果您遵循第一种方法,您需要在模型类中实现Inotifypropertychanged并且可以接受。
话虽如此,我会尝试我的水平最好的按照第二种方法,因为这将使我精确控制在视图中显示/操纵的所有属性。 另外,我会感觉好多了,我没有打破MVVM模式。