次のメソッドでは、 を使用してIEnumerable
結果をリストにコピーするとToList()
、コンストラクターでファイナライザーが呼び出されず、ビューモデルはプログラムの終了時にのみファイナライズされます。ObservableCollection
IList
IDisposable
private void ReadHeaders()
{
IList<PlanningGridHeaderVM> viewModelSet =
(from header in _planningGridService.ReloadHeaders().OrderBy(x => x.PlanNumber)
select new PlanningGridHeaderVM((PlanningGridHeader)header)).ToList();
foreach (PlanningGridHeaderVM headerVM in viewModelSet)
{
ItemEditedEventManager.AddHandler(headerVM, OnItemEdited);
PropertyChangedEventManager.AddHandler(headerVM, OnPropertyChanged, string.Empty);
}
this.ViewModels = new ObservableCollection<PlanningGridHeaderVM>(viewModelSet);
CollectionChangedEventManager.AddHandler(this.ViewModels, this.OnCollectionChanged);
}
ただし、結果をのコンストラクターでIEnumerable
直接使用すると、デバッグ出力で、その時点ですべてのビューモデル項目がGC によってファイナライズされていることが通知されます(これが私を困惑させます)。ObservableCollection
IEnumerable
IDisposable
それにもかかわらず、私はまだ目的のコレクションを画面に表示し、プログラムを閉じると、それらはすべて再びファイナライズされます(今回は予想どおり):
private void ReadHeaders()
{
IEnumerable<PlanningGridHeaderVM> viewModelSet =
(from header in _planningGridService.ReloadHeaders().OrderBy(x => x.PlanNumber)
select new PlanningGridHeaderVM((PlanningGridHeader)header));
foreach (PlanningGridHeaderVM headerVM in viewModelSet)
{
ItemEditedEventManager.AddHandler(headerVM, OnItemEdited);
PropertyChangedEventManager.AddHandler(headerVM, OnPropertyChanged, string.Empty);
}
this.ViewModels = new ObservableCollection<PlanningGridHeaderVM>(viewModelSet);
CollectionChangedEventManager.AddHandler(this.ViewModels, this.OnCollectionChanged);
}
なんで?両方の MSDN ページ ( hereおよびhere ) には、「要素は、コレクションの列挙子によって読み取られるのと同じ順序で ObservableCollection にコピーされます」と記載されています。