2010-08-19 170 views
4

我們的應用程序添加並從它的主窗口中刪除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?

回答

4

取決於您綁定的內容。

這可能是一個已知的問題:http://support.microsoft.com/kb/938416

你綁定到自定義類?您是否實現了INotifyPropertyChanged或創建了DependencyProperty?

+0

這似乎很可能,我們已經實現了INotifyPropertyChanged。 – 2011-02-03 04:14:58