首页 文章

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

提问于
浏览
53

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

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

那么如何实现该模型呢?

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

6 回答

  • 14

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

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

  • 9

    有时可以让模型实现 INotifyPropertyChanged 接口 .

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

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

  • 8

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

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

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

    如果您的模型类没有实现所需的接口,该怎么办?有时您需要使用未实现INotifyPropertyChanged,INotifyCollectionChanged,IDataErrorInfo或INotifyDataErrorInfo接口的模型对象 . 在这些情况下,视图模型可能需要包装模型对象并将所需的属性公开给视图 . 这些属性的值将由模型对象直接提供 . 视图模型将为其公开的属性实现所需的接口,以便视图可以轻松地将数据绑定到它们 .

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

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

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

  • 44

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

    但是,这会将更改定位到ViewModel by the View . 也就是说,当您更改 TextBox 中的值时,ViewModel上的 INotifyPropertyChanged 实现将刷新相关的绑定,因此View正确更新 .

    它确实涵盖了外部源(如数据库更改或其他接口)对模型所做的更改 . 只要所有数据修改都来自View,ViewModel应该知道所有更改并知道要更新的内容 . 例如,如果您知道模型上更改变量 Foo 也会更改模型上 Bar 的值,则更改 Foo 的值时,最好在ViewModel中调用 OnPropertyChanged(Foo)OnPropertyChanged(Bar) .

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

  • 3

    这是“纯粹的”MVVM编码器与其他编码器之间的经典论证 .

    我倾向于随时随地阅读书籍,因为大部分时间都是有意义的 . 但是,在某些情况下,根据需要即兴创建代码会减少大量重复代码 .

    在您的情况下,您可以将XML读取到模型类,并将模型类的副本复制到viewmodel,或将所需的属性从模型复制到视图模型 . 这样您就可以控制更新UI /模型 . 如果您遵循第一种方法,则需要在模型类中实现Inotifypropertychanged,这是可以接受的 .

    话虽如此,我会尽量遵循第二种方法,因为这样可以让我精确控制所有属性在视图中显示/操纵 . 此外,我会感觉好多了,我没有打破MVVM模式 .

  • 3

    我不确定你的意思 . 在VM中,您可能具有 INotifyPropertyChanged 或DependencyProperty-es(在这种情况下,VM必须从 DependencyObject 派生) . 两者都没有意义 . 没有它们也没有意义 .

    在模型中,您可以做任何您想做的事情 . 发射/接收事件的能力很好,但并不总是可以依赖它们 . 基本上,模型取决于源数据和相关的东西,而viewmodel具有模型与表示层的接口负载 . 由于WPF处理事件,至少VM必须提供一些通知机制 .

相关问题