Это не относится к привязкам, у вас не будет утечки памяти, даже если вы используете Source
для Binding
.
Чтобы проверить это
- Создайте
StackPanel
, TextBox
(tb1) и два Buttons
в Xaml
- В коде позади вы создаете новый
TextBox
(tb2)
- Установите
Binding
на tb1 с Source
, установленным на tb2
- Создать
WeakReference
на tb2 (который не должен быть GC'd, если у нас есть утечка)
- Добавить tb2 к
StackPanel
- Запустите программу и убедитесь, что привязка работает
- Нажмите Удалить
- Клик жив?
Возвращает значение false, источник TextBox
(tb2) был удален, поэтому у нас нет утечки памяти
Редактировать: Вы также можете переместить создание первого TextBox
из Xaml в код позади и использовать два WeakReferences
(по одному на каждый TextBox
) и убедиться, что оба текстовых поля получают GC ' правильно, и вы увидите, что это правда.
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]);
}
}