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

时间:2011-01-20 15:33:21

标签: c# wpf memory-leaks binding

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

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

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

<TextBlock Name="MyTextBlock" Text="{Binding ElementName=myGrid, Path=Children.Count}" />

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

BindingOperations.ClearBinding(MyTextBlock, TextBlock.TextProperty);

问题

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

这似乎我需要一些递归方法。

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:4)

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

  

TextBlock控件具有绑定   一个对象(myGrid)有一个   引用回TextBlock(它是   myGrid孩子之一。)

问题在于绑定发生在UIElement个对象之间,其中一个对象是容器的子节点,绑定到的属性不是DependencyProperty。同样,这不典型,因为大多数绑定发生在实现INotifyPropertyChanged的对象/属性上。

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

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