- 汎用ジェネリックコレクション ページ一覧
ObservableCollection
System.Collections.ObjectModel.ObservableCollectionクラスは、コレクションに対する挿入・削除・設定を行った際にそれらの変更をクラス外部にイベントとして通知することができるようになっているクラスです。 ObservableCollectionクラスは、ユーザーインターフェイスとコレクションの同期したい場合などに使用されます。
ObservableCollectionクラス自体はCollectionクラスを継承しているため基本的な操作はCollectionクラスと同じですが、要素の移動を行うMoveメソッドが追加されています。 クラス外からは、CollectionChangedイベント(NotifyCollectionChangedEventHandler)に適切なハンドラを設定することで、コレクションに対する変更を検出できます。
派生クラスからは、Itemsプロパティを参照することで内部コレクションにアクセスすることが出来ます。 また、SetItem, InsertItem, RemoveItem, ClearItemに加え、MoveItemの各メソッドをオーバーライドすることで要素の挿入・削除・設定・移動時の動作を拡張できます。 これらのメソッドをオーバーライドしない場合、既定の動作としてOnCollectionChangedメソッドが呼び出され、CollectionChangedイベントが発生します。
また、ObservableCollectionクラスはINotifyPropertyChangedインターフェイスも実装しています。 派生クラスでOnPropertyChangedメソッドを呼び出すようにすると、PropertyChangedイベントを発生させることが出来るようになります。
INotifyPropertyChangedインターフェイスについてはプロパティ §.プロパティ変更の通知 (INotifyPropertyChanged)を参照してください。
(未整理)
BlockReentrancyメソッドとCheckReentrancyメソッドを使うことで、コレクション変更時の再入試行を禁止できるようになります。 BlockReentrancyメソッドが返すIDisposableオブジェクトが破棄される前にCheckReentrancyを呼び出すと例外InvalidOperationExceptionをスローします。
並べ替え(ソート・リバース)
ObservableCollectionにはSortやReverseといった並べ替えのメソッドは用意されていませんが、拡張メソッドのOrderByメソッドやOrderByDescendingメソッドを使うことでコレクションをソートした結果を得ることが出来ます。
もしくは、Collectionと同様にObservableCollectionを継承して内部のコレクションをソート・リバースするメソッドを追加することが出来ます。 なお、このようにして追加したメソッドを呼び出す場合、ソート・リバースを行い要素が並べ替えられる度にCollectionChangedイベントが発生する点に注意が必要です。
次の例は、ObservableCollectionを継承してSortメソッドとReverseメソッドを実装するものです。
ReadOnlyObservableCollection
System.Collections.ObjectModel.ReadOnlyObservableCollectionクラスは名前の通り読み取り専用のObservableCollectionとして動作するコレクションクラスです。 ReadOnlyObservableCollectionクラスは、基になるObservableCollectionをコンストラクタで指定する必要があり、このObservableCollectionに対する読み取り操作のみを許可するラッパーとして動作します。 ObservableCollectionクラスがCollectionクラスを継承しているのに対し、ReadOnlyObservableCollectionクラスはReadOnlyCollectionクラスを継承しています。 そのため、基本的な操作はReadOnlyCollectionと同じです。
ReadOnlyObservableCollectionクラスではCollectionChangedイベントはprotectedなイベントとなっているため、ハンドラを設定することは出来ません。 また、ReadOnlyCollectionと同様、基になるObservableCollectionへの変更はそれをラップするReadOnlyObservableCollectionにも反映されます。