class Foo(){
public List<string> SomeCollection;
}
我需要实现一个事件,当从Collection中添加或删除某些内容时可以触发该事件。怎么做?
答案 0 :(得分:2)
查看BindingList
和ObservableCollection
类(分别在System.ComponentModel
和System.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);
}
}
}