OOP Course
Сьогодні

Підрозділ 10.6

Клас ObservableCollection<T>

Пояснює ObservableCollection<T>: створення, індексований доступ, перебір, базові методи колекції та подію CollectionChanged для реагування на додавання, видалення й заміну елементів.

10.6. Клас ObservableCollection

List<T>, Queue<T>, Dictionary<K,V> — всі ці колекції ефективно зберігають і організовують дані. Але жодна з них не повідомляє зовнішній код про те, що щось змінилось. Якщо хтось додав пацієнта до списку — UI-компонент, що відображає цей список, нічого про це не знатиме і не перемалює себе.

Клас ObservableCollection<T> з простору імен System.Collections.ObjectModel вирішує саме цю задачу. За своїми методами він ідентичний List<T> (індексований доступ, Add, Remove, Insert, Move), але кожна зміна колекції генерує подію CollectionChanged. Будь-який підписник може відреагувати: перемалювати UI, зберегти лог, синхронізувати стан.

ObservableCollection<T> є базою для прив'язки даних у WPF, MAUI, Xamarin. Якщо ви прив'язуєте колекцію до ListView чи DataGrid — майже завжди потрібна саме ObservableCollection<T>.

Внутрішня структура: подія CollectionChanged

При кожній зміні ObservableCollection<T> генерує подію CollectionChanged і передає підписникам об'єкт NotifyCollectionChangedEventArgs, де зберігається:

  • Action — тип зміни: Add, Remove, Replace, Move, Reset.
  • NewItems — список доданих або нових елементів (для Add, Replace).
  • OldItems — список видалених або замінених елементів (для Remove, Replace).

ObservableCollection<T> — сповіщення про зміни

Створення та ініціалізація

using System.Collections.ObjectModel;

// Порожня колекція
ObservableCollection<string> ward = new ObservableCollection<string>();

// З масиву
var fromArray = new ObservableCollection<string>(new[] { "Петренко", "Коваль" });

// Через ініціалізатор
var fromInit = new ObservableCollection<string>
{
    "Петренко І.",
    "Коваль М.",
    "Сидоренко О."
};

Доступ до елементів та методи

ObservableCollection<T> надає ті самі операції, що й List<T>:

var patients = new ObservableCollection<string> { "Петренко І.", "Коваль М." };

// Доступ за індексом
Console.WriteLine($"Перший: {patients[0]}");

// Зміна елемента за індексом (генерує Replace)
patients[0] = "Петренко Іван Степанович";

// Перебір
foreach (var p in patients)
    Console.WriteLine(p);

Повний перелік методів:

Метод Що робить
Add(item) Додати в кінець
Insert(index, item) Вставити за індексом
Remove(item) Видалити перше входження
RemoveAt(index) Видалити за індексом
Move(oldIndex, newIndex) Перемістити елемент на нову позицію
Clear() Очистити (генерує Reset)
Contains(item) Перевірити наявність
IndexOf(item) Індекс першого входження
CopyTo(array, index) Скопіювати в масив

Метод Move — унікальна особливість ObservableCollection<T>, якої немає в List<T>. Він переміщує елемент і генерує подію Move, що дозволяє UI-компонентам правильно анімувати переупорядкування.

Підписка на CollectionChanged — runnable приклад

Базовий сценарій: відстежуємо всі зміни списку пацієнтів у відділенні:

Відстеження з об'єктами Patient — runnable приклад

Розширений приклад з класом: журналюємо кожну зміну складу відділення:

Коли ObservableCollection?

Ситуація Рекомендація
WPF / MAUI / Xamarin прив'язка до UI ObservableCollection — обов'язково
Потрібно реагувати на зміни ззовні ObservableCollection + CollectionChanged
Звичайне зберігання і перебір даних List — легший overhead
Великі батч-операції без UI List — немає зайвих подій

ObservableCollection<T> генерує подію на кожну окрему зміну. Якщо потрібно додати 10 000 елементів — краще створити List<T>, наповнити його, а потім передати в конструктор ObservableCollection<T>(list), щоб уникнути 10 000 подій.

Розроблено Tomka Yurii · © 2026 ·