對於綁定,這不是真的,即使您將Source
用於Binding
,也不會有內存泄漏。
爲了驗證這一點
- XAML創建
- 一個
StackPanel
,一個TextBox
(TB1)和兩個Buttons
在後面的代碼創建一個新的TextBox
(TB2)
- 坐落在TB1一個
Binding
與Source
設置爲tb2
- 在tb2上創建一個
WeakReference
(如果我們有泄漏,則不應該GC'd)
- 添加TB2爲
StackPanel
- 運行程序並驗證綁定的工作
- 單擊刪除
- 點擊是還活着嗎?
返回false,源TextBox
(TB2)已被垃圾回收,所以我們都沒有內存泄漏
編輯:您也可以從XAML中移動第一TextBox
的創建到後面的代碼和使用兩個WeakReferences
(每個TextBox
一個),並驗證兩個文本框是否都正確地GC'd,你會發現這是真的。
的XAML
<StackPanel Name="stackPanel">
<TextBox Name="textBox"/>
<Button Name="removeButton" Content="Remove" Click="removeButton_Click"/>
<Button Name="isAliveButton" Content="Is Alive?" Click="isAliveButton_Click"/>
</StackPanel>
代碼隱藏
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
TextBox toBeGCdTextBox = new TextBox();
stackPanel.Children.Add(toBeGCdTextBox);
Binding textBinding = new Binding
{
Path = new PropertyPath("Text"),
Source = toBeGCdTextBox
};
textBox.SetBinding(TextBox.TextProperty, textBinding);
_weak = new WeakReference(toBeGCdTextBox);
}
private WeakReference _weak;
private void isAliveButton_Click(object sender, RoutedEventArgs e)
{
GC.Collect();
MessageBox.Show(_weak.IsAlive.ToString());
}
private void removeButton_Click(object sender, RoutedEventArgs e)
{
Debug.Assert(_weak.Target == stackPanel.Children[3]);
stackPanel.Children.Remove(stackPanel.Children[3]);
}
}
我不認爲其他控制可以得到GC'd現在還有通過結合對它的引用。 – msarchet
請不要在標題中使用諸如「C#:」之類的內容。這就是標籤的用途。 –
凱,我會停止這樣做...好點 – foreyez