3

我使用 Castle DP 用代理包装我的实体,我的实体自己实现 INotifyPropertyChanged。并在调用 set 时引发事件。

我在包装上编写了一些单元测试,以查看当我通过代理操作实体并且它们都通过时触发了 propertychanged 事件。

问题出在带有屏幕的真实应用程序上,当我将屏幕绑定到实际上是 DP 的属性时,注册到该属性的屏幕以不同的方式更改,除非我在内部实现注册管理,否则它不起作用拦截器代码

为什么这是这种行为,wpf 对我在注册属性时没有更改的属性做了什么?

4

3 回答 3

1

在城堡 AOP 中,要记住一件重要的事情 - 该Equals方法没有像您期望的那样工作。

看这里:RRSL-Lite.EntityAOP。我有同样的想法——为 INPC 提供 AOP 并创建了这个库。是一个如何使用它的简单示例。

于 2012-09-11T08:52:43.310 回答
0

作为接口代理生成的代理类将具有属性的显式接口实现,并且 WPF 绑定将不起作用,除非它显式匹配。

这两个解决方案是更改绑定路径以明确包含接口:

{Binding Path=(local:IEntity.ID)} instead of just {Binding ID}

或为您的视图模型/实体使用虚拟方法代理,并使您拦截的任何方法成为虚拟方法。

于 2011-01-12T15:31:20.120 回答
0

这可能是因为您使用 Castle 的方法或类似方法包装实体。CreateInterfaceProxyWithTarget如果您依靠您的实体来实现 INPC 并将您的PropertyChanged事件挂钩中继到底层代理目标,请记住在PropertyChanged引发事件时sender将是您的实体而不是您的代理。如果您尝试在 WPF 中绑定您的代理,它将期望sender成为代理。如果不是,它将忽略更改。解决方案是拦截事件并确保将 设置sender为您的代理

于 2017-04-18T00:44:08.000 回答