在我的应用程序中,我有一些在主窗口中打开的用户控件。我想打开用户控件并关闭它们。在每个用户控件中,我都有图片、文本框和标签,就像任何信息表单一样。我注意到垃圾收集器没有回收内存。我在互联网上搜索了一个弱点来解决我的应用程序的内存泄漏。我为我的问题找到了一些很好的答案,但其中大部分都与 .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我知道我必须摆脱以下元素:
最佳答案
弱引用背后的想法是您可以保留对对象的引用,而不会阻止它被垃圾收集。相反,当指向的对象被收集时,所有弱引用都设置为空。
我完全相信这确实有效。因此,如果您正在寻找未收集对象的根本原因,您可以放心地忽略弱引用。 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/