WPF 从任何绑定中解除所有元素及其子元素的绑定

RAM*_*RAM 2 c# data-binding wpf memory-leaks unbind

我想防止基于绑定到Static成员或...在我的WPF Window.

这个窗口包括很多UserControlelement并且有一些static资源。我知道我应该unbind使用bindingstoStatic类来防止一些内存泄漏,我知道这种情况unbinding

BindingOperations.ClearAllBindings(....);

BindingOperations.ClearBinding(...., ....);

Element.ItemsSource= null;
Run Code Online (Sandbox Code Playgroud)

但我的问题是:

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

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

Dom*_*see 6

我不相信有一种自动的方法可以做到这一点,但我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);
    }
}
Run Code Online (Sandbox Code Playgroud)