2008-12-16 86 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>派生,因为这没有(有用的)虚拟方法。