C# 如何实现事件 class Foo(){ 公开名单收集; }

C# 如何实现事件 class Foo(){ 公开名单收集; },c#,events,collections,C#,Events,Collections,我需要实现一个事件,它可以在集合中添加或删除某些内容时触发。如何做到这一点?您可以看看如何创建自己的自定义事件。您可以通过使用而不是列表来实现这一点。看看和类(分别在系统.ComponentModel和系统.Collections.ObjectModel名称空间中)-其中任何一个都应该为您做好这项工作 请注意,这两个类通常提供相同的功能,但它们确实略有不同绑定列表通常更适用于数据绑定/UI目的(因此得名),因为它允许取消更新等选项。然而,observateCollection在您的案例中可能更合

我需要实现一个事件,它可以在集合中添加或删除某些内容时触发。如何做到这一点?

您可以看看如何创建自己的自定义事件。

您可以通过使用而不是列表来实现这一点。

看看和类(分别在
系统.ComponentModel
系统.Collections.ObjectModel
名称空间中)-其中任何一个都应该为您做好这项工作

请注意,这两个类通常提供相同的功能,但它们确实略有不同<代码>绑定列表通常更适用于数据绑定/UI目的(因此得名),因为它允许取消更新等选项。然而,
observateCollection
在您的案例中可能更合适,因为您只是对更改的通知感兴趣(看起来是这样),而类完全是从这个角度设计的。它们存在于非常不同的名称空间中这一事实在某种程度上暗示了这一点。如果您想了解相似性和差异性的详细信息,我建议您检查链接的MSDN文档。

列表
不支持通知。您可以查看具有事件的
BindingList
,或者可以通过重写方法继承的
集合

如果您想在
Foo
级别公开事件,可能类似于以下内容-但将其保留在列表中可能更容易:

class Foo(){
  public List<string> SomeCollection;
}
class-Foo{
公共事件事件处理程序列表已更改;
私有只读绑定列表;
公共食物({
list=新的BindingList();
list.ListChanged+=list\u ListChanged;
}
无效列表\u ListChanged(对象发送方,ListChangedEventArgs e){
EventHandler=ListChanged;
if(handler!=null)handler(this,EventArgs.Empty);
}
公共IList SomeCollection{get{return list;}}
}
基本的一个

这是一个好主意

公共类Foo
{
私人名单(收藏);;
添加了公共事件事件处理程序;
公共无效添加(字符串项)
{
SomCollection.Add(项目);
OnAdd();
}
私有无效OnAdd()
{
如果(已添加!=null)
{
Added.Invoke(this,EventArgs.Empty);
}
}
}

当ObservableCollection做得很好时,我不认为创建自定义集合类有什么意义。@Noldorin-BindingList同样足够了。重新分类集合;在某些情况下,这是合适的——这取决于场景。@Marc:的确,BindingList做得很好;我不是在争论这个问题。正如您所说,从集合中派生有时是合适的,尽管在这里直接使用ObservableCollection或者甚至将其子类化可能更有意义?出于真正的好奇。(回复评论;另外-ObservableCollection不是在3.0中吗?这可能是一个因素…)MSDN似乎表明ObservableCollection从.NET2.0开始就存在了。就功能而言,您说BindingList提供了ObservableCollection所做的一切(以及更多)基本上是正确的。然而,值得注意的一点是,ObservableCollection实现了INotifyCollectionChanged和INotifyPropertyChanged,这在某些情况下很有用。我还认为WPF在少数情况下需要可观察的收集。正如我指出的,预期用途也略有不同,尽管这是一件小事。
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;}}
}
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);
    }
}
}