2008-12-16 96 views
2

我有一個包含對象列表的類。當列表被修改時,在類中運行一些代碼的最佳方式是什麼?修改集合(添加或刪除項目)時運行代碼

class MyManagerClass 
{ 
    ArrayList list = new ArrayList(); // will likely be a different collection class 
    private OnItemAddedToList(object o) 
    { 
     // how to call this? 
    } 

    private OnItemRemovedFromList(object o) 
    { 
     // how to call this? 
    } 
} 

回答

2

我一直使用至今的方法是使從System.Collections.ObjectModel.Collection<T>派生的私人收藏類,並直接在覆蓋調用的方法:

class MyManagerClass 
{ 
    private class MyCollection : System.Collections.ObjectModel.Collection<object> 
    { 
     private MyManagerClass manager; 

     private MyCollection(MyManagerClass manager) 
     { 
      this.manager = manager; 
     } 

     protected override void InsertItem(int index, object item) 
     { 
      base.InsertItem(index, item); 
      manager.OnItemAddedToList(item); 
     } 

     protected override void SetItem(int index, object item) 
     { 
      object oldItem = (index < base.Count) ? base[index] : null; 
      base.SetItem(index, item); 

      if (oldItem != null) { 
       manager.OnItemRemovedFromList(oldItem); 
      } 

      manager.OnItemAddedToList(item); 
     } 

     protected override void RemoveItem(int index, object item) 
     { 
      base.RemoveItem(index, item); 
      manager.OnItemRemovedFromList(item); 
     } 
    } 

    private OnItemAddedToList(object o)  
    { 
    } 

    private OnItemRemovedFromList(object o)  
    { 
    } 
} 

我'不知道這是否是正確方式做到這一點,但我想看看是否有更好的選擇。

0

就我個人而言,我會實施IList<T>,這個類別有Added,RemovedReplaced活動/代表。該類將有一個類型爲List<T>的私有實例成員,所有實現的調用都將委託給該成員,同時還會引發事件。

你可能還具有OnBefore...OnAfter如果您願意,您可以選擇「取消」添加/刪除元素。

這通常是如何完成的,但像mookid說的那樣,現有的庫可能會做類似的事情。 DataTable類實現了與DataRow類相似的概念,包括添加,刪除和更新。

您可以合併這些概念,以便添加到集合中的項目可以引發「泡泡」到集合並可用於在集合上重新生成事件ItemChanged的事件。

+0

冒泡事件正是我尋找這個功能的原因。 收藏與事件良好的做法?這個想法看起來很不舒服,因爲它聽起來像MS已經實施的東西,如果它在某種程度上不壞。 – 2008-12-16 12:47:19

3

您也可以考慮使用System.Collections.ObjectModel.ObservableCollection<T>類,它以CollectionChanged事件的形式爲您提供此信息,該信息爲您提供有關更改內容的信息。

5

如果您正在編寫自定義集合,則可以實現INotifyCollectionChangedINotifyPropertyChanged接口。他們添加可以訂閱的事件,通知監聽器集合數據何時發生變化。
這樣做,您可以訂閱收藏以外的代碼中的事件。

或者,您可以使用實現這兩個接口的ObservableCollection<T>類。 INotifyCollectionChanged接口ObservableCollection<T>僅在.Net Framework 3.0及更高版本中可用。

在.Net框架2.0,你可以使用IBindingList接口來獲得相同的功能,但它更復雜的比INotifyCollectionChanged接口來實現在3.0

+0

INotifyCollectionChanged似乎也只有3.0。 2.0中有類似的東西嗎? 是事件良好的習慣集合嗎?這聽起來像是MS從一開始就會實施的東西,如果它在某種程度上不壞。 – 2008-12-16 12:54:07

+0

嗯。你是對的。我99%確定在2.0中有類似的接口。我會檢查出來的。 – 2008-12-16 12:57:15

2

在2.0以上,有BindingList<T>擁有所有必需的可觀察集合的鉤子。現在還有(如已經提到的)ObservableCollection<T>類,它非常類似。

在很多情況下,從Collection<T>推出新集合也是非常合理的。但不要從List<T>派生,因爲這沒有(有用的)虛擬方法。

相關問題