WPF, Налаштування DataGrid

Закріплення стовпців

Стовпець, що закріплюється, залишається на місці в лівій частині елемента управління DataGrid, навіть при прокручуванні вмісту вправо. На малюнку показано, що закріплений стовпець Product залишається видимим під час прокручування. Зверніть увагу, що горизонтальна смуга прокручування знаходиться тільки під стовпцями, що прокручуються, але не під закріпленим:

DataGrid

Можливістьзакріплювати (freezing) стовпці корисна, коли потрібно, щоб певна інформація (на зразок імені товару або унікального ідентифікатора) завжди залишалася видимою. Вона включається установкою у властивостіDataGrid.FrozenColumnCount значення більше нуля. Наприклад, установка 1 призводить до закріплення першого стовпця:

Закріплені стовпці повинні завжди розміщуватись у лівій частині сітки. Якщо закріплюється один стовпець, це буде стовпець, що є крайнім ліворуч, у разі закріплення двох стовпців це будуть два перші стовпці зліва і т.д.

Як і у звичайному списковому елементі управління, DataGrid користувач має можливість вибирати окремі елементи. Коли це відбувається, ініціюється подіяSelectionChanged, на яку можна відреагувати. Для з'ясування того, який об'єкт даних вибраний в даний момент, можна використовувати властивістьSelectedItem. Якщо встановити для властивостіSelectionMode значення Extended, користувач зможе вибирати відразу кілька рядків. (Ще одним доступним варіантом є значення Single, яке застосовується для цієї властивості за умовчанням.) Вибір множини рядків здійснюється за натиснутої клавіші або . Колекція вибраних елементів зберігається у властивості SelectedItems.

Встановлення вибору в коді здійснюється за допомогою властивості SelectedItem. Якщоце робиться для елемента, який зараз не перебуває в полі зору, розумно супроводжувати це викликом методу DataGrid.ScrollIntoView(). Тоді DataGrid здійснить прокручування вперед або назад, поки вказаний елемент не стане видимим.

Сортування

Елемент керування DataGrid має вбудовану функцію сортування, для використання якої потрібна прив'язка до колекції, що реалізує інтерфейс IList (наприклад, List або ObservableCollection). У цьому випадку елемент керування DataGrid автоматично отримує базові можливості сортування.

Для застосування сортування користувач повинен клацати на заголовку стовпця. Одиночне клацання сортує елементи стовпця за зростанням на основі типу даних (наприклад, числа сортуються від 0 і далі в міру збільшення, а літери – в алфавітному порядку). Повторне клацання призводить до сортування у зворотному порядку. Праворуч від заголовка стовпця з'являється стрілка, яка показує, що DataGrid зроблено сортування з урахуванням значень у цьому стовпці. Стрілка, що вказує нагору, позначає сортування за зростанням, а вниз - за спаданням.

Зазвичай в алгоритмі сортування DataGrid використовуються прив'язані дані, що відображаються в стовпці, що має сенс. Проте, можна вибирати й іншу властивість з прив'язаного об'єкта даних, встановлюючи властивістьSortMemberPath стовпця. Для DataGridTemplateColumn використання цієї властивості взагалі є обов'язковим, оскільки в цьому класі немає властивості Binding для надання прив'язаних даних. В іншому випадку функція сортування в стовпці не підтримуватиметься.

Для відключення функції сортування у всій сітці необхідно встановити властивістьCanUserSortColumns у false. Для відключення її в окремому стовпці потрібно встановити в falseвластивість CanUserSort цього стовпця.

Редагування у DataGrid

Однією з головних зручностей елемента управління DataGrid є пропонована у ньому підтримка редагування. Кожна комірка DataGrid перемикається в режим редагування, коли користувач виконує на ній подвійне клацання. Обмежувати цю можливість DataGrid можна кількома способами.

DataGrid.IsReadOnly. Якщо ця властивість дорівнює true, користувачі не можуть редагувати.

DataGridColumn.IsReadOnly. Якщо ця властивість дорівнює true, користувачі не можуть виконувати редагування значень цього стовпця.

Властивості, призначені лише читання. Якщо об'єкт даних має властивість без засобу установки (Setter), елемент керування DataGrid розпізнає це і відключає можливість редагування у відповідному стовпці (якби властивість DataGridColumn.IsReadOnly було встановлено в true). Аналогічно, якщо властивість не є простим текстом, числом або датою, елемент керування DataGrid робить його доступним лише читання (хоча цю ситуацію можна обійти з допомогою використання DataGridTemplateColumn).

Те, що відбувається при переведенні комірки в режим редагування залежить від типу стовпця. У стовпці DataGridTextColumn відображається текстове поле (яке виглядає не дуже гладко, заповнює собою всю комірку і не має видимого кордону). У стовпці DataGridCheckBox відображається прапорець, який можна відзначати та знімати позначку. Але найцікавішим є стовпець DataGridTemplateColumn. У ньому можна замінити стандартне текстове поле для редагування спеціалізованим елементом керування введенням.

Наприклад, у наведеному нижче стовпці відображається дата. Подвійне клацання на ньому призводить до появи елемента управління, що розкриваєтьсяDatePicker, у якому вже вибрано поточне значення:

налаштування

У DataGrid автоматично підтримується базова система перевірки достовірності, яка реагує на проблеми в системі прив'язки даних (на зразок неможливості перетворення тексту, що надається, в потрібний тип даних) або винятки, що видаються засобом установки властивості.

Шаблон ErrorTemplate, що використовується для DataGridCell за замовчуванням, передбачає відображення рамки червоного кольору навколо недійсного значення, що дуже схоже на поведінку інших елементів керування введенням, таких як TextBox.

Перевірка достовірності може бути реалізована DataGrid та іншими способами. Один із них передбачає використання подій DataGrid, пов'язаних із редагуванням, які описані нижче. Події перераховані у порядку їх виникнення у DataGrid:

BeginningEdit

PreparingCellForEdit

Застосовується для шаблонних колонок. У цей момент можна виконати будь-яку ініціалізацію, яка потрібна для елементів керування редагуванням. Для доступу до елемента в CellEditingTemplate використовується властивість DataGridPreparingCellForEditEventArgs.EditingElement

CellEditEnding

RowEditEnding

Виникає при переході користувачем на новий рядок після поточного редагування. Як і у випадку CellEditEnding, у цей момент можна виконати перевірку достовірності та скасувати зміни. Зазвичай перевірка достовірності охоплює кілька стовпців, наприклад, коли значення в одному стовпці не повинно бути більше значення в іншому стовпці

Коли потрібна логіка перевірки достовірності, специфічна для сторінки (і тому включати її в об'єкти даних не можна), можна помістити її в обробники подій CellEditEnding та RowEditEnding. Уобробнику CellEditEnding виконується перевірка правил, пов'язаних зі стовпцем, а узгодженість цілого рядка перевіряється в обробнику подій RowEditEnding. Пам'ятайте, що у разі скасування редагування потрібно надати опис проблеми (зазвичай у елементі TextBlock десь на сторінці).