属性成员更改时的属性更改通知

时间:2015-08-12 20:44:35

标签: c# wpf mvvm inotifypropertychanged

假设我的ViewModel中有一个名为Location的属性Point,我的视图绑定到该属性。我正在使用MVVM Light的ObservableObjectRaisePropertyChanged设置来引发属性更改通知。问题是当我在ViewModel中执行以下内容时:

this.Location = new Point(100,100);

我的视图正确更新。但如果我这样做:

this.Location.Offset(10,10);

我的View未更新,表示Location属性未通知View有关更改。为什么会这样?内置类型的子属性如PointSize如何处理更改通知?

3 个答案:

答案 0 :(得分:0)

在MVVM中,ViewModel负责在属性更改时通知View。大多数.NET类本身并不实现INotifyPropertyChanged,因此在使用它们时不会自动接线。每次修改PropertyChanged

的任何属性时,您必须在Location属性上提升Location

或者,您可以实现自己的Point实现INotifyPropertyChanged的对象。

答案 1 :(得分:0)

您可以使用Castle Dynamic Proxy(在运行时将模型包装在代理中)或PropertyChanged.Fody(在编译时修改模型的IL)自动将INotifyPropertyChanged添加到类成员。谷歌是你的朋友。

答案 2 :(得分:0)

根本问题是Point是可变的。

您可以编写自己的ImmutablePoint,允许与现有Point类进行转换以实现API兼容性,但不允许使用Offset等方法。

它不是一个理想的解决方案,但它解决了更改属性上的字段而不是属性本身的问题。