4

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

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

    BindingOperations.ClearBinding(nameTextBox,TextBox.TextProperty);

但弱参考并没有消失。我找到了一个有用的代码项目页面,但它是用于事件处理程序的。最后,如果我误解了我提到的链接,请给我一个线索,我必须做什么?如果有其他绑定解决方案。

注意:我已经看到了链接,我知道我必须摆脱以下元素:

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

1 回答 1

5

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

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

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

于 2013-10-05T17:18:33.470 回答