根据此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);
问题:
有没有办法从表单和子控件上的所有绑定元素中删除绑定?
这似乎我需要一些递归方法。
答案 0 :(得分:6)
在WPF 4中,即使它不是INotifyPropertyChanged或DependencyObject,您也可以不担心绑定到对象时的泄漏。这个错误已得到修复。
无论如何,我认为BindingOperations.ClearAllBindings会有所帮助。
答案 1 :(得分:4)
请记住,给出的示例非常孤立,在绑定情况下并不典型。引用文件概述了这一点......
TextBlock控件具有绑定 一个对象(myGrid)有一个 引用回TextBlock(它是 myGrid孩子之一。)
问题在于绑定发生在UIElement
个对象之间,其中一个对象是容器的子节点,绑定到的属性不是DependencyProperty
。同样,这不典型,因为大多数绑定发生在实现INotifyPropertyChanged
的对象/属性上。
如果您的应用程序中有多个这样的绑定,那么方法应该是在给定容器关闭时根据需要将它们清除,如参考文档中所述。
另一种方法是简单地在View所使用的对象上公开所需的数据,并忽略对UIElement
类型DependencyPrperty
属性的绑定。虽然这并不总是实用,但它可以减轻你上述问题。