KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Базы данных » Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю

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

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Троелсен Эндрю, "Язык программирования C#9 и платформа .NET5" бесплатно, без регистрации.
Перейти на страницу:
Язык программирования C#9 и платформа .NET5 - _078.png

Класс

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
:

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)

    {

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*