ObservableCollection
は、コンテンツが変更されたときにサブスクライバーに通知できる特殊なコレクションです。一方、は、プロパティINotifyPropertyChanged
の1つが値を変更したときに、実装者がサブスクライバーに通知できるインターフェイスです。
あなたはおそらく、2つがどのように関連しているのか疑問に思っているでしょう(あなたの例では両方がセッターに「関与している」ため)。
このコードを考えてみましょう:
var model = new MyViewModel(); // assume it's the class with Payments inside
model.Payments.Add(new PaymentViewModel());
イベントの購読者はINotifyCollectionChanged.CollectionChanged
、状況が変わったことを知っているので、それに応じて更新する必要があります。
しかし今これを見てください:
var model = new MyViewModel(); // assume it's the class with Payments inside
model.Payments.Add(new PaymentViewModel()); // OK, we know what this does
model.Payments = new ObservableCollection<PaymentViewModel>();
コレクションにアイテムを追加した後、コレクション全体を別のコレクションと交換します。がこのコレクションにバインドされている場合、それ自体が更新され、最終的に空になるItemsControl
という事実が反映されると予想されます。model.Payments
しかし、どうすればそれができますか?
CollectionChanged
元のコレクション(最初のアイテムを受け取った後)が変更されていないため、役に立ちません。それを破棄して、その場所に別のものをインストールしました。切り替えが発生したことを知っているのは、Payments
プロパティセッターだけです。したがって、セッターはINotifyPropertyChanged
、コレクションが別のコレクションに置き換えられたことをサブスクライバーに通知するために使用します。もちろん、サブスクライバーはステータスを更新する必要があります。
結論:データバインディングはWPFで自動的に機能します。これは、すべてのデータバインディングコントロールがのをリッスンし、バインディングターゲットが実装されている場合は、INotifyPropertyChanged
それらもサブスクライブするためです。バインディングターゲットが変更された場合は、を通じて通知され、古いターゲットでサブスクライブを解除し、新しいターゲットでサブスクライブします。DataContext
INotifyCollectionChanged
INotifyPropertyChanged
INotifyCollectionChanged