Хотя эта функция не помогает помешать Вам повреждать вещи, она определенно помогает наложить вина , кто повредил ее.
, Но здесь некоторые основные функции, что справка препятствует тому, чтобы Вы повредили вещи.
Наконец, слияние и ветвление являются, вероятно, одной из самой мощной команды.
Вы можете унаследовать от List и добавить свой собственный обработчик, что-то вроде
using System;
using System.Collections.Generic;
namespace test
{
class Program
{
class MyList<T> : List<T>
{
public event EventHandler OnAdd;
public new void Add(T item) // "new" to avoid compiler-warnings, because we're hiding a method from base-class
{
if (null != OnAdd)
{
OnAdd(this, null);
}
base.Add(item);
}
}
static void Main(string[] args)
{
MyList<int> l = new MyList<int>();
l.OnAdd += new EventHandler(l_OnAdd);
l.Add(1);
}
static void l_OnAdd(object sender, EventArgs e)
{
Console.WriteLine("Element added...");
}
}
}
Имейте в виду, что вам нужно повторно реализовать все методы, которые добавляют объекты в ваш список. AddRange ()
не будет запускать это событие в этой реализации.
Мы не перегружали метод. Мы спрятали оригинал. Если вы Add ()
объект, когда этот класс заключен в List
, событие не будет запущено !
MyList<int> l = new MyList<int>();
l.OnAdd += new EventHandler(l_OnAdd);
l.Add(1); // Will work
List<int> baseList = l;
baseList.Add(2); // Will NOT work!!!
Что вам нужно, так это класс, у которого есть события для любого типа модификации, которая происходит в коллекции. Лучшим классом для этого является BindingList
. В нем есть события для каждого типа мутации, которые затем можно использовать для изменения списка событий.
Я считаю, что то, что вы ищете, уже является частью API в классе ObservableCollection (T) . Пример:
ObservableCollection<int> myList = new ObservableCollection<int>();
myList.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(
delegate(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add)
{
MessageBox.Show("Added value");
}
}
);
myList.Add(1);
Вы не можете сделать это с помощью List
. Однако вы можете сделать это с помощью ObservableCollection
. См. ObservableCollection
Класс .
Вы не можете сделать это со стандартными коллекциями из коробки - они просто не поддерживают уведомления об изменениях. Вы можете создать свой собственный класс путем наследования или агрегирования существующего типа коллекции или использовать BindingList
, который реализует IBindingList
и поддерживает уведомления об изменениях через ListChanged
событие.