2009-06-26 96 views
2
class Foo(){ 
    public List<string> SomeCollection; 
} 

我需要实现一个事件,当事件添加或从集合中删除时可以触发。这个怎么做?如何实现事件

回答

2

List<T>没有通知支持。你可以看看BindingList<T>,它有事件 - 或Collection<T>,它可以通过覆盖方法继承。

如果你想暴露在Foo水平时,或许有点像下面 - 但它可能更容易离开就行了:

class Foo{ 
    public event EventHandler ListChanged; 
    private readonly BindingList<string> list; 
    public Foo() { 
     list = new BindingList<string>(); 
     list.ListChanged += list_ListChanged; 
    } 
    void list_ListChanged(object sender, ListChangedEventArgs e) { 
     EventHandler handler = ListChanged; 
     if (handler != null) handler(this, EventArgs.Empty); 
    } 
    public IList<string> SomeCollection {get {return list;}} 
} 
+1

当ObservableCollection非常好地完成这项工作时,我没有看到创建自定义Collection类的要点。 – Noldorin 2009-06-26 22:08:45

2

看看(分别在System.ComponentModelSystem.Collections.ObjectModel命名空间)的BindingListObservableCollection类 - 无论是一个人应该为你做的工作做好。

请注意,这两个类通常提供相同的功能,但它们确实有点不同。 BindingList通常更适合数据绑定/ UI目的(因此它的名称),因为它允许选项取消更新等。然而,ObservableCollection可能更适合您的情况,因为您只是希望收到变更通知(看起来),并且该类纯粹是从这个角度设计的。它们存在于非常不同的命名空间中的事实对此有所提示。如果您需要关于相似性和差异的确切细节,我建议您检查链接的MSDN文档。

+0

(回答进行评论;还 - 是不是在3.0的ObservableCollection 这可能是一个因素...) – 2009-06-26 22:32:59

+0

MSDN似乎暗示ObservableCollection自.NET 2.0以来一直存在。在功能方面,你说BindingList提供ObservableCollection所做的一切(以及更多)基本上是正确的。但有一点需要注意的是,ObservableCollection实现了INotifyCollectionChanged和INotifyPropertyChanged,在某些情况下这很有用。我也相信WPF在少数情况下需要ObservableCollection。正如我指出的那样,预期用法也略有不同,尽管这是一件小事。 – Noldorin 2009-06-26 22:37:38

0

基本一...

这里是一个很好的link

public class Foo 
{ 
private List<string> _SomeCollection; 
public event EventHandler Added; 

public void Add(string item) 
{ 
    SomCollection.Add(item); 
    OnAdd(); 

} 

private void OnAdd() 
{ 
    if (Added != null) 
    { 
     Added.Invoke(this, EventArgs.Empty); 
    } 
} 
}