Привязка к списку вызывает утечку памяти
Когда я связываю ItemsSource объекта ListBox со списком, механизм привязки удерживает элементы списка после того, как элемент управления исчезнет. Это приводит к тому, что все элементы списка остаются в памяти. Проблема исчезает при использовании ObservalbleCollection. Почему это происходит?
XAML внутри тега окна
<Grid>
<StackPanel>
<ContentControl Name="ContentControl">
<ListBox ItemsSource="{Binding List, Mode=TwoWay}" DisplayMemberPath="Name"/>
</ContentControl>
<Button Click="Button_Click">GC</Button>
</StackPanel>
</Grid>
Код позади:
public MainWindow()
{
InitializeComponent();
DataContext = new ViewModel();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
this.DataContext = null;
ContentControl.Content = null;
GC.Collect();
GC.WaitForPendingFinalizers();
}
ViewModel
class ViewModel : INotifyPropertyChanged
{
//Implementation of INotifyPropertyChanged ...
//Introducing ObservableCollection as type resolves the problem
private IEnumerable<Person> _list =
new List<Person> { new Person { Name = "one" }, new Person { Name = "two" } };
public IEnumerable<Person> List
{
get { return _list; }
set
{
_list = value;
RaisePropertyChanged("List");
}
}
class Person
{
public string Name { get; set; }
}
Изменить: Чтобы проверить утечку личности, я использовал ANTS и .Net памяти профилировщик. Оба показывают, что после нажатия кнопки GC только механизм привязки удерживает ссылку на объекты человека.