Sye*_*yed 57 .net wpf design-patterns mvvm inotifypropertychanged
我有清晰的思路View
,并ViewModel
在MVVM模式.我打算在我的应用程序中实现MVVM模式.我正面临关于模型的问题.我有.xml文件,它被解析,信息显示在视图中.
我需要第一次收到有关模型更改的通知.从需求开始我需要得到通知.
那么如何实现该模型呢?
我应该INotifyPropertyChanged
在模型类中实现接口吗?(我读过该模型不应该实现INotifyPropertyChanged
接口,因为它是WPF特定的)
akj*_*shi 48
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中的所有内容.
Pie*_*ler 15
标准MVVM方法INotifyPropertyChanged
仅在ViewModel上实现.目的是在ViewModel中发生更改时刷新View上的相应绑定.
但是,这会针对View对ViewModel 的更改.也就是说,当您更改a中的值时TextBox
,INotifyPropertyChanged
ViewModel上的实现将刷新相关的Bindings,因此View正确更新.
它并没有覆盖由外部源对模型所做,像数据库的改变或另外的接口的改变.只要所有数据修改都来自View,ViewModel应该知道所有更改并知道要更新的内容.例如,如果你知道,更改变Foo
你的模型也将发生变化的价值Bar
你型号,这将是明智的,同时调用OnPropertyChanged(Foo)
和OnPropertyChanged(Bar)
当您更改的值在您的视图模型Foo
.
另一种方法是使用Model和ViewModel之间的事件来刷新ViewModel上需要更新的那些值.如果,正如您所说的那样,通知是"仅限第一次",那么在某些触发器上执行手动一次性刷新也应该有效.
Fir*_*roz 10
这是使用MVVM时非常常见的问题,INotifyPropertyChanged
因为它不属于WPF,System.ComponentModel
所以不需要在解决方案中添加任何WPF特定引用.
如果您将INofityPropertyChanged
在模型中实现,它可以在ViewModel(代理属性)中节省更多代码.所以Model有可以接受INotifyPropertyChanged
.
有时,让模型实现INotifyPropertyChanged
接口是可以接受的.
例如,如果模型具有许多要显示的属性,并且您希望避免在viewmodel中实现大量代码(代理属性)以公开此类模型属性.
请查看http://msdn.microsoft.com/en-us/magazine/ff798279.aspx
我不确定你的意思。在 VM 中,您可能具有 、INotifyPropertyChanged
或 DependencyProperty-es(在这种情况下,VM 必须派生自DependencyObject
)。两者兼而有之毫无意义。没有它们也是没有意义的。
在模型中,你可以做任何你想做的事。触发/接收事件的能力很好,但并不总是你可以依赖它们。基本上,模型取决于源数据和相关内容,而视图模型具有模型与表示层的接口负载。由于 WPF 基于事件工作,因此至少VM 必须提供某种通知机制。
归档时间: |
|
查看次数: |
22424 次 |
最近记录: |