FrameworkElement.GetBindingExpression为数据绑定元素返回null

时间:2017-11-08 08:51:47

标签: c# wpf data-binding .net-4.5

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

我想检查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>

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

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

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

然后sizeBinding具有第一个元素null(对于Width)和用于Height绑定的绑定表达式实例。 我可以使用mode = TwoWay设置绑定,但是我想知道为什么如果Mode未设置为TwoWay,则不会创建绑定实例。我认为这是因为表达需要比路径更复杂。但是,我已尝试Width="{Binding Size.Width, Mode=OneWay}",但GetBindingExpression为此绑定返回null。 我尝试了BindingOperations GetBinding *方法,但它们的行为与FrameworkElement.GetBindingExpression完全相同。

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

1 个答案:

答案 0 :(得分:2)

原因很明显是,在建立Binding之后,您明确地将UserControl的Width属性设置在某处。

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