【问题标题】:Is there any way to remove bindings from all bound elements on a form close event?有没有办法从表单关闭事件的所有绑定元素中删除绑定?
【发布时间】:2011-06-12 13:18:15
【问题描述】:

根据这个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}" />

为避免绑定内存泄漏,我们需要像这样删除表单关闭事件的绑定:

BindingOperations.ClearBinding(MyTextBlock, TextBlock.TextProperty);

问题

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

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

【问题讨论】:

    标签: c# wpf memory-leaks binding


    【解决方案1】:

    在 WPF 4 中,即使绑定到对象不是 INotifyPropertyChanged 或 DependencyObject,您也不必担心泄漏。此错误已修复。

    无论如何我想BindingOperations.ClearAllBindings 会有所帮助。

    【讨论】:

    • 您能否提供一个链接或参考来说明 WPF 4 中正在修复的这个错误?
    • support.microsoft.com/kb/938416/en-us 我发现它是用我自己的测试修复的
    • here 重新定位测试表明问题仍然存在于 .Net 4 中。
    • 恐怕你是对的。看起来他们修复了一个错误并添加了另一个错误。我们有时仍然会遇到内存泄漏,这可以通过添加“空”的 INotifyPropertyChanged 或 INotifyCollectionChanged 实现来解决。真可惜。
    • 那么,这个答案正确还是错误? cmets 使其不清楚。我读过的其他内容似乎绑定到 CLR 属性仍然会导致泄漏。
    【解决方案2】:

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

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

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

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

    另一种方法是简单地公开 View 使用的对象上所需的数据,而忽略与不属于 DependencyPrperty 类型的 UIElement 属性的绑定。虽然这并不总是实用的,但它会帮助您摆脱上述问题。

    【讨论】:

    • 虽然解释得很好,但这并不能真正回答“有没有办法从表单和子控件上的所有绑定元素中删除绑定?”
    猜你喜欢
    • 2016-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    • 2011-07-14
    • 2023-03-30
    • 2016-11-05
    • 1970-01-01
    相关资源
    最近更新 更多