2011-08-17 34 views
4

MSDNからOnCollectionChangedについて:アイテムが追加、削除、変更、移動、またはリスト全体が更新されたときに発生します。C#ObservableCollection OnCollectionChangedはアイテムが変更されたときに起動しません。

私のコレクションにあるobjに接続されているプロパティを変更していますが、OnCollectionChangedは起動されていません。私は、objクラスのiNotifyPropertyChangedを実装しています。

public class ObservableBatchCollection : ObservableCollection<BatchData> 
    { 
     protected override void OnCollectionChanged(System.Collections.Specialized.NotifyCollectionChangedEventArgs e) 
     { 
      if(e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add) 
      { 
       foreach (BatchData item in e.NewItems) 
       { 

       } 
      } 
      base.OnCollectionChanged(e); 
     } 

     public ObservableBatchCollection(IEnumerable<BatchData> items) 
      : base(items) 
     { 

     } 
} 

私には、オブジェクトのプロパティなど、コレクションのアイテムが変更されたときに、このイベントが発生することがわかります。しかし、そうではありません。カスタムコレクションのアイテムがいつ変更されるのかを知りたいので、必要に応じてそのコレクションの計算を実行できます。

どのような考えですか?

答えて

7

ObservableCollection<T>は、コレクション自体が変更された場合にのみイベントを発生させます。内部状態が変更されたコレクションに含まれるアイテムはコレクションの構造を変更していないため、ObservableCollection<T>はそれを報告しません。

サブタイトルをObservableCollection<T>に設定し、追加時に各アイテムのOnPropertyChangedイベントにサブスクライブすることもできます。そのハンドラでは、カスタムイベントを発生させるか、または自身のPropertyChangedイベントにフォールバックすることができます。このルートを使用する場合は、汎用制約を追加してT : INotifyPropertyChangedにする必要があります。

+0

これは、「変更された」とは、古いアイテムを変更しないで 'collection [i] = newItem;'を実行することを意味します。 – CodeNaked

+1

ああ。ドキュメントは私には少し不明です。 "...アイテムが変更されたとき..."とは、私には、アイテムが変更されたときを意味します。 Hehe。皆さんありがとう。 – Yatrix

+0

あなたは正しいです - それは間違って言われているので不明です。 "アイテムが追加、削除、変更された、移動された、またはリスト全体がリフレッシュされたときに発生する" - コンマの配置は、アイテムを追加したとき(項目があるとき)削除されたとき、(アイテムがあるとき)変更されたとき、(アイテムが移動されたときに)移動されたとき、またはリスト全体が更新されたとき)。 –

関連する問題