为什么带有绑定的WPF UserControl不会收集垃圾?
问题描述:
我们的应用程序添加并从它的主窗口中删除WPF(4.0)UserControls,并且我们注意到它们没有收到垃圾收集(通过永不返回null的WeakReferences)。看起来,如果UserControl有发生绑定,即使该控件从未添加到树中。在一个控制台应用程序最简单重现如下:为什么带有绑定的WPF UserControl不会收集垃圾?
主程序
class Program
{
[STAThread]
static void Main(string[] args)
{
var obj = GetObj();
var ctl = GetCtl();
for (int x = 0; x < 4; x++)
{
GC.Collect();
Thread.Sleep(1000);
}
bool objAlive = obj.IsAlive;
bool ctlAlive = ctl.IsAlive;
Console.WriteLine(objAlive + "-" + ctlAlive);
Console.ReadLine();
}
private static WeakReference GetObj()
{
return new WeakReference(new object());
}
private static WeakReference GetCtl()
{
return new WeakReference(new MyCtl());
}
}
MyCtl用户控制(代码后面是标准的,未被修改
<UserControl <!--Snip Default Namespaces-->>
<TextBlock Text="{Binding Blah}" />
</UserControl>
objAlive是假,但ctlAlive是真的。如果从UserControl XAML中删除绑定,两者都是假的。如果我连接上emory profiler,MyCtl仍然悬而未决,但我无法弄清楚引用它是什么(提示如何使用jetBrains找到它)。
这是预期的行为,还是我需要做更多来清理我的WPF UserControl?
答
取决于您绑定的内容。
这可能是一个已知的问题:http://support.microsoft.com/kb/938416
你绑定到自定义类?您是否实现了INotifyPropertyChanged或创建了DependencyProperty?
这似乎很可能,我们已经实现了INotifyPropertyChanged。 – 2011-02-03 04:14:58