.net 修改集合(添加或删除项)时运行代码
我有一个包含对象列表的类。修改列表时,在类中运行某些代码的最佳方式是什么.net 修改集合(添加或删除项)时运行代码,.net,collections,.net,Collections,我有一个包含对象列表的类。修改列表时,在类中运行某些代码的最佳方式是什么 class MyManagerClass { ArrayList list = new ArrayList(); // will likely be a different collection class private OnItemAddedToList(object o) { // how to call this? } private OnItemRemov
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?
}
}
<>而不是使用Sale.St集合中的ARARYLIST。它有类似于
CollectionChanged
,itemsadded
等事件。到目前为止,我使用的方法是创建一个派生自System.Collections.ObjectModel.collection
的私有集合类,并直接在覆盖中调用这些方法:
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)
{
}
}
类MyManagerClass
{
私有类MyCollection:System.Collections.ObjectModel.Collection
{
私人MyManagerClass经理;
私人MyCollection(MyManagerClass manager)
{
this.manager=经理;
}
受保护的重写void插入项(int索引,对象项)
{
基本插入项(索引,项目);
项目经理(项目);
}
受保护的覆盖无效集合项(整数索引,对象项)
{
对象oldItem=(索引
我不确定这是否是正确的方法,我想看看是否有更好的替代方法。就我个人而言,我将在一个类中实现
IList
,该类已添加,删除和替换事件/委托。该类将有一个类型为List
的私有实例成员,所有实现的调用都将委托给该成员,并引发事件
如果愿意,您还可以使用OnBefore…
,OnAfter
,允许您“取消”元素的添加/删除
这是典型的做法,但正如mookid所说,可能有一些现有的库也在做类似的事情。DataTable
类实现了与DataRow
类类似的概念,包括添加、删除和更新
您可以将这些概念组合起来,以便添加到集合中的项可以将“代码> OnChchange < /Cuff>事件“冒泡”集中到集合中,并可用于在集合中重新生成<代码> ITMechange 事件。 < P>您还可以考虑使用<代码> Stask.ObjistMask.VistabeCelpEng/<代码>类,它以CollectionChanged事件的形式为您提供此信息,该事件为您提供有关更改内容的信息。如果您仍在编写自定义集合,则可以实现INotifyCollectionChanged
或inotifPropertyChanged
接口。它们添加您可以订阅的事件,当集合数据以某种方式发生更改时通知侦听器。
这样,您可以在集合之外的代码中订阅事件
或者,您可以使用实现这两个接口的ObservableCollection
类。INotifyCollectionChanged
接口和ObservableCollection
仅在.Net Framework 3.0及更高版本中可用
在.Net Framework 2.0上,您可以使用IBindingList
接口来获得相同的功能,但它的实现比3.0中的INotifyCollectionChanged
接口要复杂得多。在2.0及更高版本中,有BindingList
接口,它具有可观察集合的所有必要挂钩。现在还有一个(如前所述)与之非常相似的ObservableCollection
类
从collection
派生新集合在许多情况下也是相当合理的。但是不要从列表中派生,因为它没有(有用的)虚拟方法。冒泡事件正是我寻找此功能的原因。具有活动的集合是否是良好的实践?这个想法似乎让人不舒服,因为它听起来像是微软已经实现的东西,如果它在某种程度上还不错的话。2.0中有类似的东西吗?有活动的收藏是否是良好的实践?这听起来像是微软从一开始就应该实现的东西,如果它在某种程度上不坏的话。你是对的。我99%确信2.0中有类似的接口可用。我来看看。我找到了:-)IBindingList接口可以这样使用。哦。我不明白为什么将事件添加到列表中会很糟糕。您只在需要订阅服务器的地方添加订阅服务器,因此在所有其他情况下,事件都在那里,什么也不做。IBindingList似乎有点过火,因为PropertyDescriptor进行了所有排序和搜索。。。它得到了正确的事件,但是在这一点上实现它是一件非常麻烦的事情,仅仅是为了一般性地公开特性。我想这就是为什么他们把它分成3.0。