Підрозділ 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).

Створення та ініціалізація
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 |
| Великі батч-операції без UI | List |
ObservableCollection<T> генерує подію на кожну окрему зміну. Якщо потрібно додати 10 000 елементів — краще створити List<T>, наповнити його, а потім передати в конструктор ObservableCollection<T>(list), щоб уникнути 10 000 подій.