WPF上的城堡动态代理和INotifyPropertyChanged

问题描述:

我用代理使用Castle DP包装我的实体,我的实体自己实现INotifyPropertyChanged。并在调用set时提升事件。WPF上的城堡动态代理和INotifyPropertyChanged

我写了一些关于包装的单元测试,看到当我通过代理操纵实体并且他们都通过时,propertychanged事件被触发。

问题是在屏幕上的一个真正的应用程序,当我将屏幕绑定到一个属性,实际上是一个DP,屏幕注册属性changedchanged以不同的方式,它只是不工作,除非我实现拦截器代码

为什么是这样的行为,这是什么WPF上,我做登记财产时没有属性里面做的注册管理改变了吗?

+1

你能告诉我们你的代码吗? – 2010-08-24 14:06:32

+0

作者:DP,你的意思是动态代理或依赖属性? – 2010-08-24 14:51:00

+0

我的意思是动态代理 – 2010-08-25 10:15:19

作为接口代理生成的代理类将有属性和WPF结合将不工作,除非它explictely匹配的显式接口实现。

两个解决办法是改变你的结合路径明确地包括接口:

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

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

+0

绑定是好的..问题是与INPC – 2011-01-12 16:50:43

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

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

这可能是由于您正在使用Castle的CreateInterfaceProxyWithTarget方法或类似方法将您的实体包装起来。如果你相信你的实体实施INPC并中继您PropertyChanged事件挂钩到底层的代理目标,裸记住当PropertyChanged事件引发的sender将是你实体不是你代理。如果您试图在WPF中绑定您的代理,它将预计sender代理。如果不是,它会忽略变化。解决方案是拦截事件并确保您将sender设置为您的代理