请帮我查看数据绑定属性。
我想检查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元素上检查了这一点,Height
和Width
属性绑定到数据上下文
<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。但我不清楚
答案 0 :(得分:2)
原因很明显是,在建立Binding之后,您明确地将UserControl的Width
属性设置在某处。
这样做会删除OneWay绑定(即用另一个local value替换它),但保持一个TwoWay绑定(并更新其源属性)。