【问题标题】:FrameworkElement.GetBindingExpression returns null for databound elementFrameworkElement.GetBindingExpression 为数据绑定元素返回 null
【发布时间】:2017-11-08 08:51:47
【问题描述】:

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

我想检查是否在 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 的第一个元素为空(对于宽度)和高度绑定的绑定表达式实例。 我可以接受为绑定设置的 mode=TwoWay,但是我想知道如果 Mode 未设置为 TwoWay,为什么不创建绑定实例。我认为这是因为表达式需要比路径更复杂。但是我试过Width="{Binding Size.Width, Mode=OneWay}"GetBindingExpression 为这样的绑定返回null。 我尝试过BindingOperations GetBinding* 方法,但它们的行为与FrameworkElement.GetBindingExpression 完全相同。

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

【问题讨论】:

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


    【解决方案1】:

    原因肯定是在绑定建立之后,您在某处明确设置了 UserControl 的 Width 属性。

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

    【讨论】:

    • 看来你是对的。我尝试绑定 Uid 属性并且 GetBindingEpression 有效。但是我还没有找到明确设置宽度和高度的位置。呈现控制时可能来自 wpf 引擎。谢谢解释
    猜你喜欢
    • 2020-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 2017-12-26
    相关资源
    最近更新 更多