为什么带绑定的WPF UserControl没有收集垃圾?

时间:2010-08-19 00:17:03

标签: wpf memory-leaks garbage-collection

我们的应用程序在它的主窗口中添加和删除了WPF(4.0)UserControls,我们注意到它们没有收集垃圾(通过WeakReferences永远不会返回null)。似乎如果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中删除Binding,则两者都为false。如果我连接一个内存探查器,MyCtl仍然在闲逛,但我无法弄清楚引用它的内容(有关如何使用jetBrains找到它的提示,我很感激)。

这是预期的行为,还是我需要做更多的事情来清理我的WPF UserControls?

1 个答案:

答案 0 :(得分:4)

取决于你绑定的内容。

这可能是一个已知问题:http://support.microsoft.com/kb/938416

您是否绑定到自定义类?你实现了INotifyPropertyChanged还是制作了DependencyProperty?