我有一个WPF CustomControl,它具有一个称为SelectedRange的依赖属性。

在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为null-例如它在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);


感谢您的所有帮助,希望对您有所帮助!

关于c# - 调试/断点WPF BindingExpression为空的原因,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20029968/

10-10 20:06