我使用 Castle DP 用代理包装我的实体,我的实体自己实现 INotifyPropertyChanged。并在调用 set 时引发事件。
我在包装上编写了一些单元测试,以查看当我通过代理操作实体并且它们都通过时触发了 propertychanged 事件。
问题出在带有屏幕的真实应用程序上,当我将屏幕绑定到实际上是 DP 的属性时,注册到该属性的屏幕以不同的方式更改,除非我在内部实现注册管理,否则它不起作用拦截器代码
为什么这是这种行为,wpf 对我在注册属性时没有更改的属性做了什么?
我使用 Castle DP 用代理包装我的实体,我的实体自己实现 INotifyPropertyChanged。并在调用 set 时引发事件。
我在包装上编写了一些单元测试,以查看当我通过代理操作实体并且它们都通过时触发了 propertychanged 事件。
问题出在带有屏幕的真实应用程序上,当我将屏幕绑定到实际上是 DP 的属性时,注册到该属性的屏幕以不同的方式更改,除非我在内部实现注册管理,否则它不起作用拦截器代码
为什么这是这种行为,wpf 对我在注册属性时没有更改的属性做了什么?
在城堡 AOP 中,要记住一件重要的事情 - 该Equals方法没有像您期望的那样工作。
看这里:RRSL-Lite.EntityAOP。我有同样的想法——为 INPC 提供 AOP 并创建了这个库。这是一个如何使用它的简单示例。
作为接口代理生成的代理类将具有属性的显式接口实现,并且 WPF 绑定将不起作用,除非它显式匹配。
这两个解决方案是更改绑定路径以明确包含接口:
{Binding Path=(local:IEntity.ID)} instead of just {Binding ID}
或为您的视图模型/实体使用虚拟方法代理,并使您拦截的任何方法成为虚拟方法。
这可能是因为您使用 Castle 的方法或类似方法包装实体。CreateInterfaceProxyWithTarget如果您依靠您的实体来实现 INPC 并将您的PropertyChanged事件挂钩中继到底层代理目标,请记住在PropertyChanged引发事件时sender将是您的实体而不是您的代理。如果您尝试在 WPF 中绑定您的代理,它将期望sender成为代理。如果不是,它将忽略更改。解决方案是拦截事件并确保将 设置sender为您的代理。