2012-04-20 9 views
6

ObservableCollectionINotifyPropertyChangedの仕組みが混乱しています。ObservableCollectionとINotifyPropertyChangedの違いは何ですか?

私はこのコードを持っている:

Payments = new ObservableCollection<PaymentViewModel>(_allPayments); 

public ObservableCollection<PaymentViewModel> Payments 
{ 
    get { return _payments; } 
    set { 
     _payments = value; 
     RaisePropertyChanged("Payments"); 
    } 
} 

を私はここObservableCollectionINotifyPropertyChangedとの関係が何であるかを理解していません。説明できますか?

答えて

6

は、その内容変化加入者に通知することができる特殊なコレクションです。

2つがどのように関連しているのだろうと思っています(両方ともあなたの例のセッターに関係しているため)。今物事が変更されていることを知っているであろうINotifyCollectionChanged.CollectionChangedイベントへ

var model = new MyViewModel(); // assume it's the class with Payments inside 
model.Payments.Add(new PaymentViewModel()); 

加入者と、彼らはそれに応じて更新する必要があります:

は、このコードを考えてみましょう。

しかし、今これを見て:私たちは、その後、コレクションに別の1ためスワップコレクション全体を項目を追加した後

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を利用して、コレクションが別のコレクションに置き換えられたことをサブスクライバに伝えます。もちろん、そのステータスを更新する必要があります。

結論:結合対象は、彼らが同様にそのを購読するINotifyCollectionChangedを実装している場合、すべてのデータバインドされたコントロールがそのDataContextINotifyPropertyChangedに耳を傾けるためデータは、WPFで自動的に作品を結合。バインディングターゲットが変更された場合は、INotifyPropertyChangedによって通知され、古いターゲットのINotifyCollectionChangedからの登録を解除し、新しいターゲットに登録します。

2

ObservableCollectionはバインダーに通知します。たとえば、コレクション自体に何かが追加/削除されたときなどです。

しかし、2番目の例では、コレクションが新しいコレクションに置き換えられたことをバインダーに通知しています(新しいObservableCollectionを実行すると、ObservableCollection自体は実行されません。 )。 INotifyPropertyChangedの場合、それらの特性変更値の一実装は、加入者に通知することを可能にするインターフェースである

ObservableCollection
+0

私もあなたの答えを理解しています。あなたも良い答えを与えます。ありがとうございます。 – pratikjgandhi

関連する問題