WPF 4.5 : how to remove weak reference caused by binding to an object in order to avoid memory leak

标签 wpf data-binding memory-leaks weak-references

在我的应用程序中,我有一些在主窗口中打开的用户控件。我想打开用户控件并关闭它们。在每个用户控件中,我都有图片、文本框和标签,就像任何信息表单一样。我注意到垃圾收集器没有回收内存。我在互联网上搜索了一个弱点来解决我的应用程序的内存泄漏。我为我的问题找到了一些很好的答案,但其中大部分都与 .net framework 3.5 或更早版本有关。我使用内存分析器根据一些建议找到了线索。当我使用内存分析器时,我发现很多由于绑定(bind)到对象而导致的弱引用。这符合 link我试图在删除父控件之前删除绑定(bind),但这并没有解决我的问题。这里的xml代码:

<TextBox x:Name="nameTextBox" Text="{Binding Name, Mode=TwoWay}"  />

我将 DataContext 设置为我的模型的一个实例。我的模型如下
 public class MyModel : INotifyPropertyChanged
 {
    private string name;
    public string Name
    {
        get { return name; }
        set
        {
            if (name!= value)
            {
                name= value;
                OnProperyChanged("Name");
            }
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnProperyChanged(string propertyName)
    {
        if (PropertyChanged != null)
           this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }`
    ...
}

我尝试使用以下代码清除我的绑定(bind):
    BindingOperations.ClearBinding(nameTextBox,TextBox.TextProperty);

但弱引用并没有消失。我发现了一个有用的code project page ,但它适用于事件处理程序。最后,如果我误解了我提到的链接,请给我一个线索,我必须做什么?如果有其他绑定(bind)解决方案。

注意:我看过 Link我知道我必须摆脱以下元素:
  • 父窗口中对象的事件处理程序
  • 从静态对象注册到事件
  • 使用定时器
  • 数据绑定(bind)
  • 更改文本框的 Text 属性
  • 最佳答案

    弱引用背后的想法是您可以保留对对象的引用,而不会阻止它被垃圾收集。相反,当指向的对象被收集时,所有弱引用都设置为空。

    我完全相信这确实有效。因此,如果您正在寻找未收集对象的根本原因,您可以放心地忽略弱引用。 WPF 库对象可能会保留导致问题的其他非弱引用,并且有记录的情况会发生这种情况。

    我曾经有代码来递归删除所有数据绑定(bind),这有一些丑陋的副作用,所以我 asked this question .我可以建议您遵循@Kent 回答中的建议:确保所有绑定(bind)都相对于单个(或几个)DataContext 完成。属性,并将其设置为空。这应该完全断开所有 WPF 绑定(bind),具体取决于 DataContext .

    关于WPF 4.5 : how to remove weak reference caused by binding to an object in order to avoid memory leak,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19200104/

    相关文章:

    c# - 输入数据时希望文本框清空

    c# - 命令参数始终为 NULL

    wpf - 防止 WPF 绑定(bind)异常 : Cannot find source for binding with reference 'RelativeSource FindAncestor.....' reduces performance

    ios - 为什么 ARC 在 popViewController 之后不释放内存

    c# - 来自 TreeView 控件的绑定(bind)错误

    wpf - MVVM:通信

    c# - 用户控件使用了错误的 Datacontext

    wpf - 如何使用带有 MVVM 模型的 WPF 数据绑定(bind)来使用自定义控件填充 StackPanel

    ios - 初始化推送通知时 ionic 的奇怪内存泄漏导致卡住

    c++ - 在 C++ 中编写一个检查内存泄漏的测试用例