Castle Windsor 代理、隐式接口和 WPF 绑定

2023-12-30

我正在尝试使用 Castle Windsor 动态代理实现 WPF ViewModel。我的想法是,我想提供一个接口(下面的 IPerson 应该足以作为示例)、一个具体的支持类和一个拦截器(用于提供 INotifyPropertyChanged 的​​自动实现)。拦截器的实现在这里:http://www.hightech.ir/SeeSharp/Best-Implementation-Of-INotifyPropertyChange-Ever http://www.hightech.ir/SeeSharp/Best-Implementation-Of-INotifyPropertyChange-Ever

我看到的问题是,当我将模型绑定到 WPF 控件时,控件不会将模型视为实现 INotifyPropertyChanged。我相信(但不确定)这是因为 Windsor 显式实现了接口,而 WPF 似乎期望它们是隐式的。

有什么方法可以使这项工作起作用,以便拦截器捕获模型的更改并将其提升到模型吗?

所有版本的库都是最新的:Castle.Core 2.5.1.0 和 Windsor 2.5.1.0

代码如下:

// My model's interface
public interface IPerson : INotifyPropertyChanged
{
    string First { get; set; }
    string LastName { get; set; }
    DateTime Birthdate { get; set; }
}

// My concrete class:
[Interceptor(typeof(NotifyPropertyChangedInterceptor))]
class Person : IPerson
{
    public event PropertyChangedEventHandler PropertyChanged = (s,e)=> { };
    public string First { get; set; }
    public string LastName { get; set; }
    public DateTime Birthdate { get; set; }
}

// My windsor installer
public class Installer : IWindsorInstaller
{
    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        container.Register(
            Component.For<NotifyPropertyChangedInterceptor>()
            .ImplementedBy<NotifyPropertyChangedInterceptor>()
            .LifeStyle.Transient);
        container.Register(
            Component.For<IPerson, INotifyPropertyChanged>()
            .ImplementedBy<Person>().LifeStyle.Transient);
    }
}

所以答案相当简单......来自的代码http://www.hightech.ir/SeeSharp/Best-Implementation-Of-INotifyPropertyChange-Ever http://www.hightech.ir/SeeSharp/Best-Implementation-Of-INotifyPropertyChange-Ever将拦截器定义为:

public class NotifyPropertyChangedInterceptor : IInterceptor
{
    private PropertyChangedEventHandler _subscribers = delegate { };

    public void Intercept(IInvocation invocation)
    {
        if (invocation.Method.DeclaringType == typeof(INotifyPropertyChanged))
        {
            HandleSubscription(invocation);
            return;
        }

        invocation.Proceed();

        if (invocation.Method.Name.StartsWith("set_"))
        {
            FireNotificationChanged(invocation);
        }
    }

    private void HandleSubscription(IInvocation invocation)
    {
        var handler = (PropertyChangedEventHandler)invocation.Arguments[0];

        if (invocation.Method.Name.StartsWith("add_"))
        {
            _subscribers += handler;
        }
        else
        {
            _subscribers -= handler;
        }
    }

    private void FireNotificationChanged(IInvocation invocation)
    {
        var propertyName = invocation.Method.Name.Substring(4);
        _subscribers(invocation.InvocationTarget, new PropertyChangedEventArgs(propertyName));
    }
}

就我而言,InvocableTarget 根本不是作为第一个参数传递给 PropertyChanged 的​​正确实体(因为我正在生成代理)。将最后一个函数更改为以下内容解决了问题:

private void FireNotificationChanged(IInvocation invocation)
{
    var propertyName = invocation.Method.Name.Substring(4);
    _subscribers(invocation.Proxy, new PropertyChangedEventArgs(propertyName));
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Castle Windsor 代理、隐式接口和 WPF 绑定 的相关文章

随机推荐

  • Safari 中的 EventTarget 接口

    我开始延长EventTarget界面中添加一些有用的prototypes但后来我在 Safari 8 上测试了它并得到 Error ReferenceError Can t find variable EventTarget 我发现MDN
  • 谷歌日历 API 与 PHP

    我需要集成谷歌日历 API 以在我的 php 网站中显示登录用户谷歌日历 其功能与谷歌日历中的所有功能相同 有什么可能的方法来做到这一点 目前正在处理这个https developers google com google apps cal
  • 多线程GUI编程需求说明

    我正在寻找关于在图形应用程序中使用多线程的必要性的良好解释 在下面的示例中使用了Python 但问题不是Python特定的 它可能适用于任何语言的图形编程的一般设计 让我们举一个简单的例子 假设有一个应用程序对一组文件执行某种耗时的操作 并
  • 如何强制 Visual Studio 使用 x64 DNX SDK 架构

    我使用的是 1 0 0 beta7 x64 但视觉工作室坚持我使用的是 x86 当我删除除目标运行时之外的所有运行时时 我得到以下信息 我在项目中的任何地方都找不到 x86 的引用 当我将鼠标悬停在此处的解决方案 DNX SDK 版本上时
  • 使用 cron 作业删除日志文件

    你好 我想从文件夹中删除过去 7 天的所有日志文件 但保留所有其他文件 我可以使用下面的命令吗 如何指定它只删除扩展名为 log 的文件 find path to file mtime 7 exec rm f 我是否需要将此命令写入某个文件
  • 防止 pytest 中长字符串被截断

    我使用 pytest 编写了一个测试工具 用于对我们的代码进行系统测试 这些测试在我们的持续集成系统中使用 因此我使用 junit xml 输出选项 pytest 截断长字符串给我带来了问题 我知道我可以使用 vv 选项来阻止它 但是这会为
  • 实体框架 5 为表指定多个标识列。每个表只允许有一个标识列

    我正在创建此模型作为我的代码优先实体框架的一部分 public class NewUserRegistration Key public int NewUserRegistrationId get set 使用Update Database
  • 半透明/透明状态栏+CoordinatorLayout+工具栏+Fragment

    我有以下设置 我正在使用 AppCompat MainActivity 包含一个片段并有一个工具栏 向下滚动时会隐藏 Fragment with RecyclerView 所有适合屏幕的视图都有相应的android fitsSystemWi
  • 创建在 gtk 中自动更新的小部件,同时仍然能够控制其他小部件

    好吧 在我学习更多 Python 的过程中的一个副项目中 我一直在尝试构建一个 gtk 应用程序来监控水温并以 10 秒的间隔更新 gtk 应用程序中的文本框 我还希望能够有一个倒计时器 可以在 gtk 中显示 同时每秒刷新一次 我有一个使
  • Pythonic 确定当前元素是生成器的第一个元素还是最后一个元素的方法?

    我正在检查一个生成器 确定当前元素是生成器的第一个元素还是最后一个元素的 Pythonic 方法是什么 因为它们需要特别小心 thanks 基本上生成标签 所以我有类似的项目 div class first 1 div div div di
  • 动态向类添加属性

    之前曾在 Stack Overflow 上询问过这个问题 但似乎没有一个答案能够准确解决我需要做的事情 就我而言 我希望这些动态添加的属性成为从数据库存储和读取值的快捷方式 因此不幸的是它并不那么容易正如在这个答案中 https stack
  • asp.net mvc 错误处理程序不显示自定义错误页面

    我正在尝试遵循中的示例这个链接 http blogs msdn com b gduthie archive 2011 03 17 get to know action filters in asp net mvc 3 using handl
  • 是否有与嵌套类关联的构造函数

    我想知道是否有任何构造函数涉及内部类 例如考虑下面给出的代码片段 class MyOuter private int x 10 class MyInner void dostuff System out println The value
  • 如何避免 Javascript/jQuery 中的硬编码、链式异步函数?

    我的程序中几乎所有函数都有某种异步调用 但它们都依赖于某些先前函数的结果 因此 我将下一个函数调用硬编码到每个单独的函数中 如下所示 function getStuff ajax success function results other
  • 即使配置未完成,使用 android:configure 配置的小部件也会收到 onUpdate

    这是我配置应用程序小部件的方式
  • 如何禁用reactjs中的链接?

    我的reactjs应用程序中有这个 import Link from react router lib Link 一直试图禁用此链接 但这没有达到预期的效果 它只是让它变得不可见 如何禁用 根据条件 reactjs 链接 包含很多问题反应路
  • Firefox 和 Chrome 在 POST 期间将 LF 替换为 CR+LF

    为什么 Firefox 和 Chrome 在 POST 过程中将 LF 字符替换为 CR LF 我写了以下内容作为测试
  • Logcat 数据未显示在 DDMS Eclipse 的“日志”选项卡中

    日志选项卡在 DDMS 中可见 我已经使用 Log v 记录数据已有一周了 没有出现任何问题 如今 日志数据不再显示在日志窗口中 工作了 然后进行了编程更改以跟踪错误 现在日志数据不再显示 已尝试在外部 Android 手机 Android
  • 何时/如何调用 IDisposable.Dispose?

    给定以下实现两者的类Dispose and IDisposable Dispose internal class DisposableClass IDisposable public void Dispose void IDisposabl
  • Castle Windsor 代理、隐式接口和 WPF 绑定

    我正在尝试使用 Castle Windsor 动态代理实现 WPF ViewModel 我的想法是 我想提供一个接口 下面的 IPerson 应该足以作为示例 一个具体的支持类和一个拦截器 用于提供 INotifyPropertyChang