Выбери любимый жанр

Выбрать книгу по жанру

Фантастика и фэнтези

Детективы и триллеры

Проза

Любовные романы

Приключения

Детские

Поэзия и драматургия

Старинная литература

Научно-образовательная

Компьютеры и интернет

Справочная литература

Документальная литература

Религия и духовность

Юмор

Дом и семья

Деловая литература

Жанр не определен

Техника

Прочее

Драматургия

Фольклор

Военное дело

Последние комментарии
оксана2018-11-27
Вообще, я больше люблю новинки литератур
К книге
Professor2018-11-27
Очень понравилась книга. Рекомендую!
К книге
Vera.Li2016-02-21
Миленько и простенько, без всяких интриг
К книге
ст.ст.2018-05-15
 И что это было?
К книге
Наталья222018-11-27
Сюжет захватывающий. Все-таки читать кни
К книге

Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю - Страница 209


209
Изменить размер шрифта:

Класс

ObservableCollection<T>
удобен своей возможностью информировать внешние объекты, когда его содержимое каким-то образом изменяется (как и можно было догадаться, работа с
ReadOnlyObservableCollection<T>
похожа, но по своей природе допускает только чтение).

Работа с классом ObservableCollection<T>

Создайте новый проект консольного приложения по имени

FunWithObservableCollections
и импортируйте в первоначальный файл кода C# пространство имен
System.Collections.ObjectModel
. Во многих отношениях работа с
ObservableCollection&lt;T&gt;
идентична работе с
List&lt;T&gt;
, учитывая, что оба класса реализуют те же самые основные интерфейсы. Уникальным класс
ObservableCollection&lt;T
> делает тот факт, что он поддерживает событие по имени
CollectionChanged
. Указанное событие будет инициироваться каждый раз, когда вставляется новый элемент, удаляется (или перемещается) существующий элемент либо модифицируется вся коллекция целиком.

Подобно любому другому событию событие

CollectionChanged
определено в терминах делегата, которым в данном случае является
NotifyCollectionChangedEventHandler
. Этот делегат может вызывать любой метод, который принимает
object
в первом параметре и
NotifyCollectionChangedEventArgs
— во втором. Рассмотрим следующий код, в котором наполняется наблюдаемая коллекция, содержащая объекты
Person
, и осуществляется привязка к событию
CollectionChanged
:

using System;

using System.Collections.ObjectModel;

using System.Collections.Specialized;

using FunWithObservableCollections;

// Сделать коллекцию наблюдаемой

// и добавить в нее несколько объектов Person.

ObservableCollection&lt;Person&gt; people = new ObservableCollection&lt;Person&gt;()

{

  new Person{ FirstName = &quot;Peter&quot;, LastName = &quot;Murphy&quot;, Age = 52 },

  new Person{ FirstName = &quot;Kevin&quot;, LastName = &quot;Key&quot;, 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
допускается проверять на предмет равенства любому из членов перечисления
NotifyCollectionChangedAction
:

(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})

public enum NotifyCollectionChangedAction

{

  Add = 0,

  Remove = 1,

  Replace = 2,

  Move = 3,

  Reset = 4,

}

Ниже показана реализация обработчика событий

CollectionChanged
, который будет обходить старый и новый наборы, когда элемент вставляется или удаляется из имеющейся коллекции (обратите внимание на оператор
using
для
System.Collections.Specialized
):

using System.Collections.Specialized;

...

static void people_CollectionChanged(object sender,

  NotifyCollectionChangedEventArgs e)

{

  // Выяснить действие, которое привело к генерации события.

  Console.WriteLine(&quot;Action for this event: {0}&quot;, e.Action);

  // Было что-то удалено.

  if (e.Action == NotifyCollectionChangedAction.Remove)

  {

    Console.WriteLine(&quot;Here are the OLD items:&quot;);  // старые элементы

    foreach (Person p in e.OldItems)

    {

      Console.WriteLine(p.ToString());

    }

    Console.WriteLine();

  }

  // Было что-то добавлено.

  if (e.Action == NotifyCollectionChangedAction.Add)

  {

    // Теперь вывести новые элементы, которые были вставлены.

    Console.WriteLine(&quot;Here are the NEW items:&quot;);  // Новые элементы

  foreach (Person p in e.NewItems)

    {