2011-08-17 111 views
4

從關於OnCollectionChanged的MSDN:「在添加,刪除,更改,移動項目或刷新整個列表時發生。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

哦。對我來說,文檔有點不清楚。 「...當一件物品被......改變時」,對我來說,意思是「當一件物品被改變時」。呵呵。謝謝大家。 – Yatrix

+0

你是對的 - 目前還不清楚,因爲它措辭不正確。 「在添加,刪除,更改*,移動或整個列表刷新時發生 - 」逗號的位置表示您應該將其讀爲:「添加項目時(項目存在時)刪除,(當一個項目被更改),(當一個項目被移動時),或當整個列表被刷新時「。 – 2013-06-24 16:58:59

相關問題