You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在后台代码中设置{Binding}?BindingProxy构造函数初始化问题排查

问题分析与修复方案

嘿,我来帮你拆解这段BindingProxy代码里的问题,其实有两个关键的小错误导致你没能实现预期效果:

1. 构造函数名称拼写错误

你写的构造函数是BindigProxy(),但你的类名是BindingProxy(注意中间的'n')——构造函数的名称必须和类名完全一致,否则这个构造函数根本不会被调用,相当于你白写了这段初始化逻辑。这是最明显的语法错误,编译器甚至可能给你报错提示。

2. 绑定的Source设置错误

你在构造函数里给Binding指定了Source = this,这会把Data属性绑定到BindingProxy自身,而不是你想要的当前上下文的DataContext。原来的正确用法Data="{Binding}"其实是没有指定Source的,它会自动继承所在元素的DataContext,所以这里应该创建一个不带Source的Binding实例。


修正后的完整代码

public class BindingProxy : Freezable
{
    #region Overrides of Freezable
    protected override Freezable CreateInstanceCore()
    {
        return new BindingProxy();
    }
    #endregion

    public object Data
    {
        get { return (object)GetValue(DataProperty); }
        set { SetValue(DataProperty, value); }
    }

    public static readonly DependencyProperty DataProperty = 
        DependencyProperty.Register("Data", typeof(object), typeof(BindingProxy), new UIPropertyMetadata(null));

    // 修正拼写错误的构造函数名称
    public BindingProxy()
    {
        // 去掉错误的Source设置,直接创建默认Binding
        BindingOperations.SetBinding(this, DataProperty, new Binding());
    }
}

额外说明

Freezable类型之所以能用来做BindingProxy,是因为它可以脱离可视化树但仍然保留DataContext的绑定关系。修正后的代码现在可以直接用<local:BindingProxy x:Key="proxy" />,它会自动把Data属性绑定到当前的DataContext,和你最初想要的效果一致。

内容的提问来源于stack exchange,提问作者Sinatr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:20:32