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

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

在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!"); } } } 

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

所以我的问题是 – 如何调试为什么这个BindingExpression为空 – 例如它在XAML中设置如何找出它被设置为null的位置?

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

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

此问题是由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); 

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

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

 PresentationTraceSources.TraceLevel=High 

例如

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

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