これは、WPFを十分に長くプレイすると、最終的に発生する典型的な問題です。
私はさまざまな解決策を試しましたが、最も効果的なのは次のようなBindingListを使用することです。
public class WorldViewModel : INotifyPropertyChanged
{
private BindingList<Person> m_People;
public BindingList<Person> People
{
get { return m_People; }
set
{
if(value != m_People)
{
m_People = value;
if(m_People != null)
{
m_People.ListChanged += delegate(object sender, ListChangedEventArgs args)
{
OnPeopleListChanged(this);
};
}
RaisePropertyChanged("People");
}
}
}
private static void OnPeopleListChanged(WorldViewModel vm)
{
vm.RaisePropertyChanged("People");
}
public event PropertyChangedEventHandler PropertyChanged;
void RaisePropertyChanged(String prop)
{
PropertyChangedEventHandler handler = this.PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(prop));
}
}
}
次に、ObservableCollectionで行うのと同じように、Peopleコレクションにバインドします。ただし、アイテム内のプロパティが変更されたときにバインドが再評価されます。
また、OnPeopleListChangedは静的であるため、メモリリークが発生しないことに注意してください。
そして、PersonはINotifyPropertyChangedを実装する必要があります。