Язык программирования C#9 и платформа .NET5
Часть 209 из 642 Информация о книге
Класс
удобен своей возможностью информировать внешние объекты, когда его содержимое каким-то образом изменяется (как и можно было догадаться, работа сObservableCollection<T>похожа, но по своей природе допускает только чтение).ReadOnlyObservableCollection<T>Работа с классом ObservableCollection<T>
Создайте новый проект консольного приложения по имени
и импортируйте в первоначальный файл кода C# пространство именFunWithObservableCollections. Во многих отношениях работа сSystem.Collections.ObjectModelидентична работе сObservableCollection<T>, учитывая, что оба класса реализуют те же самые основные интерфейсы. Уникальным классList<T>> делает тот факт, что он поддерживает событие по имениObservableCollection<T. Указанное событие будет инициироваться каждый раз, когда вставляется новый элемент, удаляется (или перемещается) существующий элемент либо модифицируется вся коллекция целиком.CollectionChangedПодобно любому другому событию событие
определено в терминах делегата, которым в данном случае являетсяCollectionChanged. Этот делегат может вызывать любой метод, который принимаетNotifyCollectionChangedEventHandlerв первом параметре иobject— во втором. Рассмотрим следующий код, в котором наполняется наблюдаемая коллекция, содержащая объектыNotifyCollectionChangedEventArgs, и осуществляется привязка к событиюPerson:CollectionChangedusing System;using System.Collections.ObjectModel;using System.Collections.Specialized;using FunWithObservableCollections;// Сделать коллекцию наблюдаемой// и добавить в нее несколько объектов Person.ObservableCollection<Person> people = new ObservableCollection<Person>(){new Person{ FirstName = "Peter", LastName = "Murphy", Age = 52 },new Person{ FirstName = "Kevin", LastName = "Key", Age = 48 },};// Привязаться к событию CollectionChanged.people.CollectionChanged += people_CollectionChanged;static void people_CollectionChanged(object sender,System.Collections.Specialized.NotifyCollectionChangedEventArgs e){throw new NotImplementedException();}Входной параметр
определяет два важных свойства,NotifyCollectionChangedEventArgsиOldIterns, которые выдают список элементов, имеющихся в коллекции перед генерацией события, и список новых элементов, вовлеченных в изменение. Тем не менее, такие списки будут исследоваться только в подходящих обстоятельствах. Вспомните, что событиеNewItemsинициируется при добавлении, удалении, перемещении или сбросе элементов. Чтобы выяснить, какое из упомянутых действий запустило событие, можно использовать свойствоCollectionChangedобъектаAction. СвойствоNotifyCollectionChangedEventArgsдопускается проверять на предмет равенства любому из членов перечисленияAction:NotifyCollectionChangedActionpublic enum NotifyCollectionChangedAction{Add = 0,Remove = 1,Replace = 2,Move = 3,Reset = 4,}Ниже показана реализация обработчика событий
, который будет обходить старый и новый наборы, когда элемент вставляется или удаляется из имеющейся коллекции (обратите внимание на операторCollectionChangedдляusing):System.Collections.Specializedusing System.Collections.Specialized;...static void people_CollectionChanged(object sender,NotifyCollectionChangedEventArgs e){// Выяснить действие, которое привело к генерации события.Console.WriteLine("Action for this event: {0}", e.Action);// Было что-то удалено.if (e.Action == NotifyCollectionChangedAction.Remove){Console.WriteLine("Here are the OLD items:"); // старые элементыforeach (Person p in e.OldItems){Console.WriteLine(p.ToString());}Console.WriteLine();}// Было что-то добавлено.if (e.Action == NotifyCollectionChangedAction.Add){// Теперь вывести новые элементы, которые были вставлены.Console.WriteLine("Here are the NEW items:"); // Новые элементыforeach (Person p in e.NewItems){
