如何实现事件

时间:2009-06-26 21:53:19

标签: c# events collections

class Foo(){
  public List<string> SomeCollection;
}

我需要实现一个事件,当从Collection中添加或删除某些内容时可以触发该事件。怎么做?

5 个答案:

答案 0 :(得分:2)

查看BindingListObservableCollection类(分别在System.ComponentModelSystem.Collections.ObjectModel命名空间中) - 任何一个都应该为您完成这项工作。

请注意,这两个类通常提供相同的功能,但它们略有不同BindingList通常更适合数据绑定/ UI目的(因此它的名称),因为它允许选项取消更新等。但是,ObservableCollection在您的情况下可能更合适,因为您只是对收到变更通知感兴趣(看起来似乎),而且这个类纯粹是从这个角度设计的。事实上,它们存在于非常不同的命名空间中,这有点暗示。如果您想了解相似点和不同点的确切详细信息,我建议您检查链接的MSDN文档。

答案 1 :(得分: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;}}
}

答案 2 :(得分:1)

您可以在制作自己的自定义活动时查看this tutorial

答案 3 :(得分:0)

您可以使用ObservableCollection代替列表来执行此操作。

答案 4 :(得分: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);
    }
}
}