调试/断点为什么WPF BindingExpression为null

时间:2013-11-17 11:14:25

标签: c# wpf xaml data-binding

我有一个名为SelectedRange的depdendency属性的WPF CustomControl。

在XAML的应用程序中,绑定设置如下:

SelectedRange="{Binding Source={StaticResource ResourceKey=MainWindow},
                         Path=GlobalXRange, Mode=TwoWay}"

我在代码中发现BindingExpression被覆盖(设置为null)。我可以用这段代码确定这个:

public IRange SelectedRange
{
    get { return (IRange)GetValue(SelectedRangeProperty); }
    set
    {
        SetValue(SelectedRangeProperty, value);
        Binding b = BindingOperations.GetBinding(this, SelectedRangeProperty);

        BindingExpression be =
             BindingOperations.GetBindingExpression(this, SelectedRangeProperty);
        if (be == null)
        {
            Console.WriteLine("Binding expression is null!");
        }
    }
}

事实证明,应用程序启动后BindingExpression为null。

所以我的问题是 - 如何调试此BindingExpression为空的原因 - 例如它是在XAML中设置的,如何找到它被设置为null的位置?

注意:输出控制台中没有绑定错误

2 个答案:

答案 0 :(得分:3)

好的家伙,感谢您的帮助,我设法解决了这个问题。对于未来的读者,我在这里是如何做到的。

此问题是由DependencyProperty Precedence引起的。对SelectedRange的TwoWay绑定位于ItemTemplate内,并被正在调用SetValue(SelectedRangeProperty,value)的自定义控件覆盖。

WPF中的解决方案是使用SetCurrentValue(SelectedRangeProperty, value)

但是,我正在编写一个跨平台控件(Silverlight,WinRT),这种方法在SL / WinRT中不可用。为了解决方法,我必须创建一个绑定来通过代码中的代理设置SelectedRangeProperty,例如

var binding = new Binding();
binding.Source = this;
binding.Path = new PropertyPath(SelectedRangeProxyProperty);
binding.Mode = BindingMode.TwoWay;
this.SetBinding(SelectedRangeProperty, binding);

感谢您的帮助,希望这有助于其他人!

答案 1 :(得分:2)

您可以通过在绑定表达式中添加以下内容来启用绑定跟踪:

PresentationTraceSources.TraceLevel=High

E.g。

{Binding
  Source={StaticResource ResourceKey=MainWindow},
  Path=GlobalXRange,
  Mode=TwoWay,
  PresentationTraceSources.TraceLevel=High}

然后,您将在调试窗口中获得有关绑定的其他信息。