有没有办法获取Window的所有BindingExpression对象?
我正在尝试刷新表单时,需要触发刷新表单的PropertyChanged事件数量太高而且不是一个好选项。我想的是表单/窗口可以重新查询所有绑定的另一种方式。
答案 0 :(得分:3)
如果您使用参数PropertyChanged
或PropertyChangedEventArgs
的{{1}}举null
,则所有属性的绑定都会更新。
反过来做的事情要复杂得多,而且我认为可能性能更高。您需要在整个窗口中检查每个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是公共的,因此您也可以使用它。 您应该能够轻松地从中推断出解决方案。