为什么带有绑定的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?

+0

这似乎很可能,我们已经实现了INotifyPropertyChanged。 – 2011-02-03 04:14:58