如何在后台代码中设置{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
相关产品推荐
相关产品推荐

