有没有办法获取Window的所有BindingExpression对象?

时间:2011-02-16 22:38:45

标签: wpf binding

有没有办法获取Window的所有BindingExpression对象?

我正在尝试刷新表单时,需要触发刷新表单的PropertyChanged事件数量太高而且不是一个好选项。我想的是表单/窗口可以重新查询所有绑定的另一种方式。

2 个答案:

答案 0 :(得分:3)

如果您使用参数PropertyChangedPropertyChangedEventArgs的{​​{1}}举null,则所有属性的绑定都会更新。

[MSDN Reference]

反过来做的事情要复杂得多,而且我认为可能性能更高。您需要在整个窗口中检查每个DependencyObject的每个DependencyProperty以进行绑定。

编辑:编写了以下粗略的扩展方法,它可以满足您的要求,效率非常低(可能还有改进的余地,但您仍在处理相当复杂的算法):< / p>

String.Empty

答案 1 :(得分:3)

仅供参考,当您调用BindingOperations.ClearAllBindings()时,WPF本身就是这样做的(遍历所有数据绑定属性)。 代码如下:

public static void ClearAllBindings(DependencyObject target)
{
    if (target == null)
    {
        throw new ArgumentNullException("target");
    }
    LocalValueEnumerator localValueEnumerator = target.GetLocalValueEnumerator();
    ArrayList arrayList = new ArrayList(8);
    while (localValueEnumerator.MoveNext())
    {
        LocalValueEntry current = localValueEnumerator.Current;
        if (BindingOperations.IsDataBound(target, current.Property))
        {
            arrayList.Add(current.Property);
        }
    }
    for (int i = 0; i < arrayList.Count; i++)
    {
        target.ClearValue((DependencyProperty)arrayList[i]);
    }
}

LocalValueEnumerator是公共的,因此您也可以使用它。 您应该能够轻松地从中推断出解决方案。