Из Pro C # 5.0 и .NET 4.5 Framework
Класс ObservableCollection<T>
очень полезен тем, что он способен информировать внешние объекты, когда его содержимое изменилось в некоторыхспособ (как вы можете догадаться, работа с ReadOnlyObservableCollection<T>
очень похожа, но доступна только для чтения).Во многих отношениях работа с ObservableCollection<T>
идентична работе с List<T>
, учитывая, что оба этих класса реализуют одинаковые основные интерфейсы.Класс ObservableCollection<T>
уникален тем, что этот класс поддерживает событие с именем CollectionChanged
.Это событие будет срабатывать всякий раз, когда вставляется новый элемент, текущий элемент удаляется (или перемещается), или если вся коллекция изменяется.Как и любое событие, CollectionChanged определяется в терминах делегата, который в данном случае равен NotifyCollectionChangedEventHandler
.Этот делегат может вызывать любой метод, который принимает объект в качестве первого параметра и NotifyCollectionChangedEventArgs
в качестве второго.Рассмотрим следующий метод Main (), который заполняет наблюдаемую коллекцию, содержащую объекты Person, и связывает событие CollectionChanged
:
class Program
{
static void Main(string[] args)
{
// Make a collection to observe and add a few Person objects.
ObservableCollection<Person> people = new ObservableCollection<Person>()
{
new Person{ FirstName = "Peter", LastName = "Murphy", Age = 52 },
new Person{ FirstName = "Kevin", LastName = "Key", Age = 48 },
};
// Wire up the CollectionChanged event.
people.CollectionChanged += people_CollectionChanged;
// Now add a new item.
people.Add(new Person("Fred", "Smith", 32));
// Remove an item.
people.RemoveAt(0);
Console.ReadLine();
}
static void people_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
// What was the action that caused the event?
Console.WriteLine("Action for this event: {0}", e.Action);
// They removed something.
if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Remove)
{
Console.WriteLine("Here are the OLD items:");
foreach (Person p in e.OldItems)
{
Console.WriteLine(p.ToString());
}
Console.WriteLine();
}
// They added something.
if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add)
{
// Now show the NEW items that were inserted.
Console.WriteLine("Here are the NEW items:");
foreach (Person p in e.NewItems)
{
Console.WriteLine(p.ToString());
}
}
}
}
Входящий параметр NotifyCollectionChangedEventArgs
определяет два важных свойства, OldItems
и NewItems
, который предоставит вам список предметов, которые были в данный момент в коллекции до события, и новые предметы, которые были вовлечены в изменение.Тем не менее, вы захотите изучить эти списки только при правильных обстоятельствах.Напомним, что событие CollectionChanged может возникать при добавлении, удалении, перемещении или сбросе элементов.Чтобы узнать, какое из этих действий вызвало событие, вы можете использовать свойство Action объекта NotifyCollectionChangedEventArgs.Свойство Action можно проверить на любом из следующих элементов перечисления NotifyCollectionChangedAction
:
public enum NotifyCollectionChangedAction
{
Add = 0,
Remove = 1,
Replace = 2,
Move = 3,
Reset = 4,
}
![Members of System.Collections.ObjectModel](https://i.stack.imgur.com/HEZ2M.png)