假设我的ViewModel中有一个名为Location
的属性Point
,我的视图绑定到该属性。我正在使用MVVM Light的ObservableObject
和RaisePropertyChanged
设置来引发属性更改通知。问题是当我在ViewModel中执行以下内容时:
this.Location = new Point(100,100);
我的视图正确更新。但如果我这样做:
this.Location.Offset(10,10);
我的View未更新,表示Location
属性未通知View有关更改。为什么会这样?内置类型的子属性如Point
或Size
如何处理更改通知?
答案 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
等方法。
它不是一个理想的解决方案,但它解决了更改属性上的字段而不是属性本身的问题。