Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 在MVVM模型中,模型是否应该实现INotifyPropertyChanged接口?_.net_Wpf_Design Patterns_Mvvm_Inotifypropertychanged - Fatal编程技术网

.net 在MVVM模型中,模型是否应该实现INotifyPropertyChanged接口?

.net 在MVVM模型中,模型是否应该实现INotifyPropertyChanged接口?,.net,wpf,design-patterns,mvvm,inotifypropertychanged,.net,Wpf,Design Patterns,Mvvm,Inotifypropertychanged,我对MVVM模式中的View和ViewModel有清晰的认识。我计划在我的应用程序中实现MVVM模式。我面临一个关于模型的问题。我有一个.xml文件,它被解析,信息显示在视图中 我只需要第一次收到关于模型更改的通知。从要求开始,我需要得到通知 那么,如何实现该模型呢 我是否也应该在模型类中实现INotifyPropertyChanged接口?(我读到模型不应该实现INotifyPropertyChanged接口,因为它是特定于WPF的)我不确定您的意思。在VM中,您可以更改INotifyProp

我对MVVM模式中的
View
ViewModel
有清晰的认识。我计划在我的应用程序中实现MVVM模式。我面临一个关于模型的问题。我有一个.xml文件,它被解析,信息显示在视图中

我只需要第一次收到关于模型更改的通知。从要求开始,我需要得到通知

那么,如何实现该模型呢


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

我不确定您的意思。在VM中,您可以更改
INotifyPropertyChanged
,也可以更改DependencyProperty(在这种情况下,VM必须派生自
DependencyObject
)。两者兼而有之毫无意义。也没有任何意义


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

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

但是,此操作的目标是通过视图对ViewModel进行更改。也就是说,当您更改
文本框中的值时,ViewModel上的
INotifyPropertyChanged
实现将刷新相关绑定,因此视图将正确更新

它不包括外部源对模型所做的更改,如数据库更改或其他接口。只要所有数据修改都来自视图,ViewModel就应该知道所有更改并知道要更新的内容。例如,如果您知道在您的模型上更改变量
Foo
也会更改模型上
Bar
的值,那么当您更改
Foo
的值时,最好在ViewModel中同时调用
OnPropertyChanged(Foo)
OnPropertyChanged(Bar)


另一种方法是使用模型和ViewModel之间的事件刷新ViewModel上需要更新的值。如您所说,如果“仅第一次”需要通知,则在某些触发器上实现手动一次性刷新也应该有效。

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

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


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


如果要在模型中实现
INofityPropertyChanged
,则可以在ViewModel(代理属性)中保存更多的代码。因此,您的模型使用
INotifyPropertyChanged

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

通常,该模型实现的功能使 绑定到视图。这通常意味着它支持属性和 通过
INotifyPropertyChanged
inotifycollection已更改
接口。模型表示的类 对象集合通常派生自
ObservableCollection
类,它提供
inotifycollection已更改
接口

尽管这取决于您是否想要那种类型的实现,但是请记住-

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

有时,您将需要使用不需要的模型对象 实现
INotifyPropertyChanged
INotifyCollectionChanged
IDataErrorInfo
INotifyDataErrorInfo
接口。在这些情况下, 视图模型可能需要包裹模型对象并显示 视图的必需属性。将显示这些属性的值 可以由模型对象直接提供。视图模型将 为其公开的属性实现所需的接口,以便 视图可以轻松地将数据绑定到它们

摘自—

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


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

这是“纯”MVVM编码器和其他人之间的一个经典论点

只要有可能,我总是照本宣科,因为大多数时候这是有道理的。但是,在某些场景中,根据需要即兴编写代码可以减少大量重复代码

在本例中,您可以将XML读入模型类,然后将模型类复制到viewmodel,或者将所需的属性从模型复制到视图模型。这样,您就可以控制UI/模型的更新。如果你遵循f