FrameworkElement.GetBindingExpression returns 数据绑定元素为 null

FrameworkElement.GetBindingExpression returns null for databound element

请帮我检查数据绑定属性。

我想检查是否在 xaml 中使用了某些 属性 的绑定 所以我写了这样的代码

var uielement = something as FrameworkElement;
if (uielement != null)
{
    var sizeBinding = new[] { FrameworkElement.WidthProperty, FrameworkElement.HeightProperty }.Select(_ => uielement.GetBindingExpression(_)).ToList();
    if (sizeBinding.Count(_ => _ != null) > 0)
    {
        Trace.WriteLine(string.Format("found {0} bindings", sizeBinding.Count()));
    }
}

我已经在 xaml 元素上检查了这个 HeightWidth 属性绑定到数据上下文

<UserControl Width="{Binding Size.Width, Mode=TwoWay}"
Height="{Binding Size.Height, Mode=TwoWay}"
> ... </UserControl>

这应该采用框架元素的宽度和高度属性,并检查(使用 GetBindingExpression 方法)绑定是否应用于这些属性。 Size 是 属性 类型的数据上下文对象 System.Windows.Size.

上面的 C# 代码适用于 xaml 代码。 但是,当绑定表达式具有最简单的形式时,例如

<UserControl Width="{Binding Size.Width}"
 Height="{Binding Size.Height, Mode=TwoWay}"
> ... </UserControl>

然后 sizeBinding 具有第一个元素 null(对于宽度)和绑定表达式实例的高度。 我可以忍受为绑定设置 mode=TwoWay,但是我想知道如果模式未设置为 TwoWay,为什么不创建绑定实例。我认为这是因为表达式需要比路径更复杂。但是我试过 Width="{Binding Size.Width, Mode=OneWay}"GetBindingExpression returns null 像这样绑定。 我试过 BindingOperations GetBinding* 方法,但它们的行为与 FrameworkElement.GetBindingExpression.

完全相同

我用谷歌搜索的唯一一个问题是 this one。但是我不清楚

原因很可能是您在建立绑定后在某处显式设置了 UserControl 的 Width 属性。

这样做会删除单向绑定(即用另一个 local value 替换它),但保留双向绑定(并更新其源 属性)。