从任何绑定中取消所有元素及其子元素的绑定

本文关键字:元素 绑定 任何 取消 | 更新日期: 2023-09-27 18:09:45

我想防止一些内存泄漏基于绑定到Static成员或…in my WPF Window .

该窗口包含大量的UserControlelement资源,并有一些static资源。我知道我应该unbind bindingsStatic类,以防止一些内存泄漏,我知道这种unbinding:

BindingOperations.ClearAllBindings(....);
BindingOperations.ClearBinding(...., ....);
Element.ItemsSource= null;

但我的问题是:

你知道或推荐任何自动 Unbind系统(一些类和代码作为一种机制来解除所有元素的绑定,以便在需要时调用它)在我们想要关闭窗口以确保没有任何绑定到Window或其UserControls及其elements和任何sub-elements中的任何元素时使用它吗?

我正在寻找一种安全的方法在窗口关闭事件中使用

从任何绑定中取消所有元素及其子元素的绑定

我不相信有一种自动的方法可以做到这一点,但是我在DependencyObject上定义了我自己的扩展方法。

public static IEnumerable<DependencyObject> EnumerateVisualChildren(this DependencyObject dependencyObject)
{
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(dependencyObject); i++)
    {
        yield return VisualTreeHelper.GetChild(dependencyObject, i);
    }
}
public static IEnumerable<DependencyObject> EnumerateVisualDescendents(this DependencyObject dependencyObject)
{
    yield return dependencyObject;
    foreach (DependencyObject child in dependencyObject.EnumerateVisualChildren())
    {
        foreach (DependencyObject descendent in child.EnumerateVisualDescendents())
        {
            yield return descendent;
        }
    }
}
public static void ClearBindings(this DependencyObject dependencyObject)
{
    foreach (DependencyObject element in dependencyObject.EnumerateVisualDescendents())
    {
        BindingOperations.ClearAllBindings(element);
    }
}