WPF 4.5:如何删除绑定到对象引起的弱引用,以避免内存泄漏

AAA*_*AAA 4 data-binding wpf memory-leaks weak-references

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

<TextBox x:Name="nameTextBox" Text="{Binding Name, Mode=TwoWay}"  />
Run Code Online (Sandbox Code Playgroud)

我将DataContext设置为我的Model的一个实例.我的模型如下

 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));
    }`
    ...
}
Run Code Online (Sandbox Code Playgroud)

我尝试使用以下代码清除我的绑定:

    BindingOperations.ClearBinding(nameTextBox,TextBox.TextProperty);
Run Code Online (Sandbox Code Playgroud)

但弱的参考并没有消失.我找到了一个有用的代码项目页面,但是它适用于事件处理程序.最后,如果我误解了我提到的链接,请告诉我一些我必须做的事情?如果有另一种绑定解决方案.

注意:我看过链接,我知道我必须摆脱以下元素:

  • 父窗口中对象的事件处理程序
  • 从静态对象注册事件
  • 使用计时器
  • 数据绑定
  • 更改文本框的Text属性

小智 5

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

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

我以前有代码递归删除所有数据绑定,这有一些丑陋的副作用所以我问这个问题.我建议你按照@ Kent的回答中的建议:确保所有绑定都是相对于单个(或几个)DataContext属性完成的,并将它们设置为null.这应该干净地断开所有WPF绑定依赖于此DataContext.