有没有办法从表单关闭事件中的所有绑定元素中删除绑定?

And*_*ich 8 c# wpf binding memory-leaks

根据此文档,以下代码导致WPF中的内存泄漏:

myDataBinding = new Binding("Children.Count");
myDataBinding.Source = myGrid; 
myDataBinding.Mode = BindingMode.OneWay;
MyTextBlock.SetBinding(TextBlock.TextProperty, myDataBinding);
Run Code Online (Sandbox Code Playgroud)

如果我们在XAML中绑定一些值,也会发生同样的情况:

<TextBlock Name="MyTextBlock" Text="{Binding ElementName=myGrid, Path=Children.Count}" />
Run Code Online (Sandbox Code Playgroud)

为了避免绑定内存泄漏,我们需要删除表单close事件上的绑定,如下所示:

BindingOperations.ClearBinding(MyTextBlock, TextBlock.TextProperty);
Run Code Online (Sandbox Code Playgroud)

问题:

有没有办法从窗体和子控件上的所有绑定元素中删除绑定?

看来我在这里需要一些递归方法.

Mar*_*nov 6

在WPF 4中,即使它不是INotifyPropertyChanged或DependencyObject,您也可以不担心绑定到对象时的泄漏.这个错误是修复的.

无论如何,我认为BindingOperations.ClearAllBindings会有所帮助.

  • 从[here]重新定位测试(http://blogs.msdn.com/b/jgoldb/archive/2008/02/04/finding-memory-leaks-in-wpf-based-applications.aspx)显示问题仍然发生在.Net 4中. (2认同)

Aar*_*ver 4

请记住,给出的示例非常孤立,在绑定情况下并不典型。参考文件概述了这一点...

\n\n
\n

TextBlock 控件具有到\n 对象 (myGrid) 的绑定,该对象\n 具有对 TextBlock 的引用(它是\n myGrid 子\xe2\x80\x99s 之一)。

\n
\n\n

问题在于,绑定是跨UIElement对象进行的,并且其中一个对象是容器的子对象,并且绑定的属性不是DependencyProperty. 同样,这并不典型,因为大多数绑定发生在实现INotifyPropertyChanged.

\n\n

如果您的应用程序中有多个这样的绑定,那么方法应该是在给定容器关闭时根据需要清除它们,如参考文档中所述。

\n\n

另一种方法是简单地公开视图所使用的对象上所需的数据,并忽略与UIElement非 type 属性的绑定DependencyPrperty。虽然这并不总是实用,但它可以减轻您上述问题。

\n