假设我在ViewModel中有一个名为Location
的类型为Point
的属性,我的视图绑定到它。我使用MVVM Light的ObservableObject
和RaisePropertyChanged
设置来引发属性更改通知。问题是,当我在ViewModel中执行以下命令时:
this.Location = new Point(100,100);
my View更新正确。但是如果我这样做:
this.Location.Offset(10,10);
我的视图不更新,意味着Location
属性不通知视图的变化。为什么会这样呢?内置类型(如Point
或Size
)的子属性如何处理更改通知?
根本问题是Point
是可变的。
您可以编写自己的ImmutablePoint
,允许从现有的Point类转换到API兼容性,但不允许像Offset
这样的方法。
这不是一个理想的解决方案,但它绕过了更改属性上的字段而不是属性本身的问题。
在MVVM中,你的ViewModel负责在属性改变时通知View。大多数。net类本身不实现INotifyPropertyChanged
,所以在使用它们时不会自动连接。每次修改Location
Location
属性上触发PropertyChanged
。或者,您可以实现自己的Point
对象来实现INotifyPropertyChanged
。
您可以使用Castle动态代理(在运行时将您的模型包装在代理中)或PropertyChanged自动将INotifyPropertyChanged添加到您的类成员中。Fody(它在编译时修改模型的IL)。谷歌是你的朋友。