ObservableCollection

DataContextとBindingでは、単一のデータ(Customer)を利用していましたが、通常バインディングでは、複数のレコード(データ)を対象すると思います。
ここでは、データ型にList(Of XXXXXX)を利用してバインドした場合の動きを見ていきます。

サンプルで利用するLanguageクラス bookmark

Languageクラスと言っても、INotifyPropertyChanged?インターフェイスを実装し、LanguageString?プロパティを持つ簡単なクラスです。
INotifyPropertyChanged?については、変更を反映するを参考にしてください。

サンプルで利用するXAML bookmark

画面レイアウト

メインのコード bookmark

あくまで動作確認する為のコードなので、処理には全然意味がありませんが・・・
「変更」「追加」「削除」それぞれのボタンで、データ更新する処理を行い、動作を見ていきます。

「変更」ボタンの動作 bookmark

「変更」ボタンを押下すると、リストボックス内のアイテムの先頭が、「[変更]中国語」になりましたね。
これは、INotifyPropertyChanged?インターフェイスの実装により、プロパティLanguageString?の変更が通知されているからです。

「追加」「削除」ボタンの動作 bookmark

「追加」「削除」ボタンを押下すると、リストボックスのアイテムには何も変化が起こりません。
しかし、_lstLanguagesはデバッグなどを行うと、処理は反映されています。これは、変更を反映するでの説明でもあるように、アイテムの内容が変更された事が通知されていない為です。
これを回避する為に、INotifyCollectionChanged?インターフェイスを実装します。

INotifyCollectionChanged?インターフェイスの実装 bookmark

サンプルではデータとしてListクラスを利用していますが、INotifyCollectionChanged?インターフェイスを実装する為に、Collectionクラスを継承したLanguagesクラスを作成して、これにINotifyCollectionChanged?インターフェイスを実装します。

このように、アイテム変更メソッドをOverridesして、INotifyCollectionChanged?インターフェイスのCollectionChanged?イベントを発生させるようにします。
これにより、アイテムが変更された事が通知されるようになります。
作成したLanguagesクラスを利用するように、以下のコード

のように変更して、動作を確認してみて下さい。
「追加」「削除」ボタンを押下すると、リストボックスのアイテムが変更されるようになりましたね。

いちいちINotifyPropertyChanged?、INotifyCollectionChanged?を実装? bookmark

では、毎回、INotifyPropertyChanged?、INotifyCollectionChanged?を実装しなければならないのか?というと、それは違います。
ObservableCollectionクラス(System.Collections.ObjectModel?)というものが提供されているので、これを利用すればいいわけです。
利用方法は、

にするだけです。
INotifyCollectionChanged?インターフェイスを実装した、Languagesクラスと同じ事が確認できます。

コメント bookmark