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 绑定 的相关文章

  • 如何从 WPF 应用程序访问 Windows 文件预览图标

    我在一个目录中有一堆图片和视频 需要在WPF应用程序中显示 我正在考虑将Win7大图标本身显示为预览图像 因为这将节省我从视频文件中抓取适当帧的工作 因为 Windows 已经很好地完成了这项工作 有任何代码片段可以访问此 Shell 图标
  • WPF Datagrid 组扩展文本 - 如何绑定?

    我正在使用带有组合框的数据网格 该组合框应该更改分组字段 我使用以下 xaml 来定义常规分组模板
  • 在WPF中如何添加菜单项事件?

    在我的 WPF 应用程序中 我添加一个菜单 然后在其下添加几个菜单项 例如 我的菜单项之一是 Main Item 然后我在 Main Item 下添加subItem1 subItem2和subItem3 我想单击 subItem1 并执行某
  • 在 Composite WPF (Prism) 中,我应该如何对我的控制器进行单元测试?

    我正在使用一个模块构建一个基本的复合 WPF Shell 我想对我的模块进行单元测试 显然 Composite WPF 以一种易于单元测试的方式模块化我的代码 下面是我想要进行单元测试的代码 它驻留在我的模块的控制器中 请注意标准复合 WP
  • MVVM ViewModel 很多属性

    我是 MVVM 新手 正在开发一个应用程序 我有一个包含很多属性的表单视图 大约 50 个 我不能将它们分离到用户控件中 因为这会破坏 mvvm 原则 我无法将它们分成模型 因为它们包含逻辑 属性更改 错误更改这些都不是 poco 类 并且
  • WPF 简单绑定到对象属性

    我在 wpf xaml 中绑定时遇到一些问题 有这个简单的文件
  • 如何知道 WPF 中的控件(或窗口)何时被渲染(绘制)?

    我需要将窗口的内容存储到图像中 保存并关闭窗口 如果我在 加载 事件上关闭窗口 则图像包含窗口 其中某些项目绘制正常 其他一些项目仅绘制了一半或扭曲 而其他项目则不在图像上 如果我设置一个计时器并在一定时间后关闭窗口 250 毫秒到 1 秒
  • 如何在 WPF 中设置窗口边框和标题栏的样式? [复制]

    这个问题在这里已经有答案了 我们正在开发一个 WPF 应用程序 它使用 Telerik 的控件套件 一切正常且看起来很好 不幸的是 我们最近需要替换所有对话框的基类 将 RadWindow 更改为标准 WPF 窗口 原因与本讨论无关 通过这
  • MVVM 创建 ViewModel

    有人可以向我解释一下如何为 MVVM 模式创建 ViewModel 我试图理解这里的教程 http msdn microsoft com en us magazine dd419663 aspx http msdn microsoft co
  • 过滤项目来源

    通过此代码 我设置了数据网格的 ItemsSource 不过 我有更多的 wpf 控件来过滤数据网格 例如从时间范围过滤数据网格 我可以为此编写一个新查询 但这似乎没有必要 因为数据已经可用 我只需要过滤它 最好的方法是什么 我能得到的任何
  • 是否可以仅突出显示图像的某些部分(不透明度)?

    我已对图像应用了不透明度 这是代码
  • MVVM 焦点到文本框

    我如何将焦点集中在TextBox没有指定名称TextBox 目前我正在做以下事情
  • 在c# wpf中从Memorystream获取Imagesource

    我怎样才能得到ImageSource from MemoryStream在 WPF 中使用 C 或转换MemoryStream to ImageSource将其显示为 wpf 中的图像 using MemoryStream memorySt
  • WPF:鼠标按下时不会触发鼠标离开事件

    我遇到鼠标进入 离开事件的问题 当按下鼠标按钮并按住光标在控件内 然后光标以足够快的速度移出控件时 此事件不会触发 你能告诉我为什么会这样吗 有什么方法可以正确获取这些事件吗 请检查示例项目以查看其实际效果 https www dropbo
  • GridSplitter 从右侧调整大小 - 奇怪的行为

    使用 Kaxaml 从左侧调整大小可以按预期工作
  • WPF 本地化扩展 MVVM 绑定

    我正在尝试绑定在 ViewModel 中声明的名为 SampleName 的属性 这里 SampleName 是关键 但是 当尝试下面的代码时 它显示为空
  • 如何在Phone类库项目中添加ResourceDictionary并访问它

    我正在开发一个项目 其中我有一个引用图书馆项目的子项目 在我的库项目 电话类库 中 如何创建 ResourceDictionary xaml 其中我需要添加一些样式并在 xaml 文件和 cs 文件中使用它 我需要访问 xaml 文件中的
  • 将 Combobox 控件绑定到 DataGrid 中的单独源

    我尝试在 DataGrid 中使用 ComboBox 这将允许用户选择来自不同表的值 我使用 ViewModel 类作为 DataContext 其中包含一个用于终端的 ObservableCollection 和另一个用于 Termina
  • 从 BitmapImage 获取支持的图像格式

    如何获取 System Windows Media Imaging BitmapImage 支持的图像格式列表 我正在用 C WPF 编写一个简单的图像处理工具 BitmapImage 类是更有用的位图类之一 因为它能够从多种格式进行解码
  • 密码盒和 MVVM

    我们有以下场景 MVVM 用户界面 用户可以在其中输入密码 实际上是一个PasswordBox 应该做一些工作的服务器 服务器连接到一些需要身份验证的数据库 我已经读过这个关于MVVM中PasswordBox的问题 https stacko

随机推荐

  • 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