Das Binden an eine Liste führt zu einem Speicherverlust

Wenn ich eine ItemsSource einer ListBox an eine List binde, behält die Bindungsengine die Listenelemente bei, nachdem das Steuerelement nicht mehr vorhanden ist. Dadurch bleiben alle Listenelemente im Speicher. Das Problem tritt bei Verwendung einer ObservalbleCollection nicht mehr auf. Warum passiert das?

Die XAML innerhalb des Fenstertags

<Grid>
    <StackPanel>
        <ContentControl Name="ContentControl">
            <ListBox ItemsSource="{Binding List, Mode=TwoWay}" DisplayMemberPath="Name"/>
        </ContentControl>
        <Button Click="Button_Click">GC</Button>
    </StackPanel>
</Grid>

Code dahinter:

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; }
}

Bearbeiten: Um das Auslaufen der Personen zu überprüfen, habe ich ANTS und .Net Memory Profiler verwendet. Beide zeigen, dass nach dem Drücken der GC-Taste nur die Bindungs-Engine den Bezug zu den Personenobjekten hält.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage