class Foo(){
public List<string> SomeCollection;
}
Мне нужно реализовать событие, которое может срабатывать при добавлении или удалении из коллекции. Как это сделать?
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;}}
}
Взгляните на BindingList
и ObservableCollection
(в пространствах имен System.ComponentModel
и System.Collections.ObjectModel
соответственно) - либо нужно хорошо выполнять работу.
Обратите внимание, что два класса обычно предоставляют одинаковые функциональные возможности, но они немного отличаются друг от друга. BindingList
обычно более подходит для целей привязки данных/пользовательского интерфейса (отсюда и название), поскольку он позволяет отменить обновления и т.д. Тем не менее, ObservableCollection
, возможно, будет более подходящим в вашем случае, поскольку вас просто интересует уведомление об изменениях (казалось бы), и класс был разработан исключительно с этой точки зрения. Тот факт, что они существуют в разных разных пространствах имен, - это намеки на это. Если вы хотите получить точную информацию о сходствах и различиях, я рекомендую вам просмотреть связанные документы MSDN.
Вы можете взглянуть на этот учебник по созданию собственных пользовательских событий.
базовый...
здесь хорошая ссылка
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);
}
}
}
Вы можете сделать это, используя ObservableCollection вместо списка.