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)
问题:
有没有办法从窗体和子控件上的所有绑定元素中删除绑定?
看来我在这里需要一些递归方法.
在WPF 4中,即使它不是INotifyPropertyChanged或DependencyObject,您也可以不担心绑定到对象时的泄漏.这个错误是修复的.
无论如何,我认为BindingOperations.ClearAllBindings会有所帮助.
请记住,给出的示例非常孤立,在绑定情况下并不典型。参考文件概述了这一点...
\n\n\n\n\nTextBlock 控件具有到\n 对象 (myGrid) 的绑定,该对象\n 具有对 TextBlock 的引用(它是\n myGrid 子\xe2\x80\x99s 之一)。
\n
问题在于,绑定是跨UIElement对象进行的,并且其中一个对象是容器的子对象,并且绑定的属性不是DependencyProperty. 同样,这并不典型,因为大多数绑定发生在实现INotifyPropertyChanged.
如果您的应用程序中有多个这样的绑定,那么方法应该是在给定容器关闭时根据需要清除它们,如参考文档中所述。
\n\n另一种方法是简单地公开视图所使用的对象上所需的数据,并忽略与UIElement非 type 属性的绑定DependencyPrperty。虽然这并不总是实用,但它可以减轻您上述问题。