【问题标题】:Castle dynamic proxy and INotifyPropertyChanged on WPFWPF 上的 Castle 动态代理和 INotifyPropertyChanged
【发布时间】:2011-04-03 04:42:15
【问题描述】:

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

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

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

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

【问题讨论】:

  • DP,你是指动态代理还是依赖属性?
  • 您能否详细说明您必须做些什么才能使其与动态代理一起使用?

标签: c# wpf castle-dynamicproxy


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 绑定没问题..问题出在INPC
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2011-01-20
      • 2020-05-03
      • 2010-12-06
      • 2013-02-11
      • 2023-03-03
      • 2013-03-06
      • 1970-01-01
      • 2011-12-17
      • 1970-01-01
      相关资源
      最近更新 更多