8

ObservableCollectionINotifyCollectionChangedと の両方を実装しINotifyPropertyChangedます。

  • アイテムの追加、削除 (+ クリア)、および置換は、コレクションのイベント を通じて消費者に通知可能であり、既存のアイテムの更新は、アイテムがそれ自体を実装する場合、アイテムのイベント CollectionChangedを使用して監視できることを理解しています。PropertyChangedINotifyPropertyChanged

  • 読み取り専用であるため、コレクションのイベントに登録できないことを他の人から読みました PropertyChanged

では、その目的は何なのか、私たちはそれをどのように利用できるのでしょうか?

あちこちのコメントは、コレクションとアイテムの両方のコンテンツの変更を通知できるように、両方のインターフェイスを実装することが魔法のようであることを暗示して、議論を混乱させているようですがObservableCollection、これは正しくありません (これは、コレクションがアイテムのコンテンツが変更された後に魔法のように更新されるリストボックスにバインドされており、コレクションがリストボックスに通知することを示唆しています)。

実際、コレクションの唯一の利点は実装することINotifyCollectionChangedです。アイテム プロパティの変更を処理するObservableCollectionのは、別のコレクションよりも簡単ではないようです。アイテムが を実装している場合にのみ可能ですが、実装INotifyPropertyChangedしていない可能性があり、ユーザーがコレクションとは無関係にこのイベントをフックできた場合にのみ可能です。

これは正しいです?

4

3 に答える 3

9

Reflectorを使用してObservableCollection<T>ソースコードを見ると、このイベントが2つのプロパティに対して発生していることがわかります。

this.OnPropertyChanged("Count");
this.OnPropertyChanged("Item[]");

ObservableCollection<T>は明示的に実装されるため、変数を介してのみイベントINotifyPropertyChangedにアクセスできることに注意してください。PropertyChangedINotifyPropertyChanged

INotifyPropertyChanged inpc = myObservableCollection;
inpc.PropertyChanged += myEventHandler;
于 2009-12-20T18:37:31.673 に答える
3

WPFバインディングメカニズムは、そのままでINotifyPropertyChanged(INpc)を使用できます。

名前が示すように、INpcを使用すると、WPFは、コレクションの一部である場合と含まれない場合があるオブジェクトプロパティへの変更を検出できます。

ObservableCollection(OC)は、INotifyCollectionChanged(InCC)を実装します。ここで、コレクション自体が、アイテムコレクションの更新(追加の削除など)をWPF(および更新を処理する機能を備えた他のユーザー)に通知します。OC自体にINpcを実装していないオブジェクトが含まれている場合、WPFには各アイテムのプロパティがどのように変更されたかを知る方法がありません。

アップデート

次の質問に答える際に、「通知を受けるために新しいアイテムごとに登録するのではなく、コレクションINpcイベントに依存できますか?」答えはいいえだ。各アイテムがそのプロパティにInpcを実装していない場合、WPFはアイテムごとにどの値が変更されたかを知る方法がありません。

WPFは、アイテムが部分的に追加または削除されたことをOCから認識します。Itemsプロパティは、プロパティにINpcを実装するクラスと同様に、INpcを使用して更新を通知します。InCCは、アイテム内の各アイテムの値ではなく、コレクションの変更を追跡するために実装されています。

于 2009-12-20T18:18:27.903 に答える
1

推測ですが、コレクションの Count プロパティの変更を通知できるのでしょうか?

于 2009-12-20T18:08:41.557 に答える