WPF 从任何绑定中取消绑定所有元素及其子元素
WPF Unbind all elements and their sub elements from any bindings
我想防止一些基于绑定到 Static
成员或...在我的 WPF
Window
.
中的内存泄漏
这个 window 包括很多 UserControl
和 element
并且有一些 static
资源。
我知道我应该 unbind
bindings
到 Static
类 来防止一些内存泄漏,我知道这种 unbinding
:
BindingOperations.ClearAllBindings(....);
BindingOperations.ClearBinding(...., ....);
Element.ItemsSource= null;
但我的问题是:
你知道或推荐任何自动 Unbind
系统(一些类和代码作为一种机制来解除绑定所有元素以在必需)在我们想要关闭 window 时使用它以确保没有绑定到 Window
或其 UserControls
及其 elements
和任何 sub-elements
???
我正在寻找一种安全方法用于window结束事件...
我不相信有自动执行此操作的方法,但我为此目的在 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);
}
}
我想防止一些基于绑定到 Static
成员或...在我的 WPF
Window
.
这个 window 包括很多 UserControl
和 element
并且有一些 static
资源。
我知道我应该 unbind
bindings
到 Static
类 来防止一些内存泄漏,我知道这种 unbinding
:
BindingOperations.ClearAllBindings(....);
BindingOperations.ClearBinding(...., ....);
Element.ItemsSource= null;
但我的问题是:
你知道或推荐任何自动 Unbind
系统(一些类和代码作为一种机制来解除绑定所有元素以在必需)在我们想要关闭 window 时使用它以确保没有绑定到 Window
或其 UserControls
及其 elements
和任何 sub-elements
???
我正在寻找一种安全方法用于window结束事件...
我不相信有自动执行此操作的方法,但我为此目的在 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);
}
}