Wpf, listview

Клас ListView - це спеціалізований клас спискового типу, призначений для відображення різних уявлень одних і тих же даних. Він особливо зручний, коли потрібно створити уявлення, що складається з безлічі стовпців і відображає про кожен елемент даних кілька різних фрагментів інформації.

Клас ListView успадкований від ListBox і доповнює його однією єдиною деталлю: властивістю View. Властивість View являє собою ще одну точку для створення багатофункціональних спискові уявлень. Якщо це властивість не встановлено, елемент ListView поводиться просто точно так же, як і його менш потужний предок - клас ListBox. Однак він стає набагато цікавішим, коли розробник надає об'єкт уявлення, який вказує, яким має бути форматування і стилі у елементів даних.

Формально властивість View вказує на екземпляр будь-якого класу, успадкованого від ViewBase (який являє собою абстрактний клас). Клас ViewBase дивно простий: в дійсності це не більше ніж оболонка, яка об'єднує разом два стилю. Один з цих стилів застосовується до елементу управління ListView (і вказується в властивості DefaultStyleKey), в той час як інший застосовується елементів всередині ListView (і вказується в властивості ItemContainerDefaultStyleKey). Властивості DefaultStyleKey і ItemContainerDefaultStyleKey фактично стиль не пропонують, а замість цього вони просто повертають вказує на нього об'єкт ResourceKey.

Зараз напевно цікаво дізнатися, а навіщо тоді взагалі потрібно властивість View - в кінці кінців, клас ListBox (як і всі класи, успадковані від ItemsControl) вже пропонує такі потужні можливості, як шаблони даних і стилі. Цілеспрямовані розробники можуть переробляти зовнішній вигляд елемента керування ListBox, надаючи інший шаблон даних, іншу панель компонування і інший шаблон елемента управління.

Взагалі кажучи, для створення настроюються списків з безліччю стовпців використовувати клас ListView з властивістю View необов'язково. Точно такого ж ефекту можна домогтися і самостійно за допомогою підтримуваних класом ListBox шаблонів і стилів. Однак властивість View є корисною абстракцією. Нижче перераховані деякі основні переваги:

Уявлення, придатні для багаторазового використання

ListView виділяє все стосуються подання деталі в один об'єкт. Це спрощує створення уявлень, що не залежать від даних і придатних для застосування з більш ніж одним списком.

Відділення елемента управління ListView від об'єктів View також спрощує перемикання між безліччю різних уявлень в одному і тому ж списку. (Наприклад, саме така технологія застосовується в провіднику Windows для отримання різних уявлень файлів і папок користувача.) Точно таку ж функціональну можливість можна створити і за рахунок динамічної зміни шаблонів і стилів, але побудувати єдиний об'єкт, що інкапсулює всі деталі уявлення, все-таки набагато легше.

Більш зручна організація

Об'єкт уявлення упаковує два стилю: один для кореневого елемента управління ListView і ще один - для окремих елементів в списку. Оскільки ці стилі упаковуються разом, очевидно, що ці два фрагменти пов'язані між собою і можуть розділяти певні деталі і взаємозалежності. Наприклад, для заснованого на шпальтах елемента управління ListView це має великий сенс, оскільки йому необхідно, щоб розміщення заголовків стовпців збігалося з розміщенням призначених для цих стовпців даних.

Застосування цієї моделі відкриває чудові можливості для створення ряду корисних готових уявлень, якими б могли користуватися всі розробники. На жаль, в даний час до складу WPF входить поки тільки один об'єкт уявлення - об'єкт GridView. Хоча його можна і зручно використовувати для побудови списків з безліччю стовпців, при наявності якихось інших потреб доведеться створювати власне спеціальне подання. У наступних розділах буде показано, як робити те й інше.

Елемент GridView буде чудовим вибором, якщо потрібно, щоб відображаються дані можна було конфігурувати, а уявлення в стилі сітки було однією з доступних для користувача опцій. Але якщо потрібно, щоб в сітці додатково підтримувалися розширена стилізація, вибір або редагування, доведеться перейти до використання повнофункціонального елемента управління DataGrid.

Створення стовпців за допомогою GridView

GridView - це клас, який успадковується від ViewBase і надає спискового подання з безліччю стовпців. Визначаються ці стовпці шляхом додавання в колекцію GridViewColumns об'єктів GridViewColumn.

GridView і GridViewColumn пропонують невеликий набір корисних методів, які розробник може використовувати для налаштування зовнішнього вигляду свого списку. Щоб створити найпростіший прямолінійний список (на кшталт Details (Список) в провіднику Windows), буде потрібно встановити для кожного об'єкта GridViewColumn всього лише два властивості: Header і DisplayMemberBinding. Властивість Header відповідає за що розміщується у верхній частині стовпчика текст, а властивість DisplayMemberBinding містить прив'язку, яку видобувають із кожного елемента даних підлягає відображенню фрагмент інформації.

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

Wpf, listview

Тут є кілька важливих моментів, на які варто звернути увагу. По-перше, розмір жодного з стовпців не є жорстко закодованим. Замість цього GridView встановлює розмір стовпців відповідно до розміру самого широкого видимого елемента (чи шпальти заголовка, якщо той займає більше місця в ширину), що цілком логічно для заснованого на гнучкій компонуванні світу WPF. (Звичайно, при наявності величезних значень стовпців це трохи ускладнює справу. В такому випадку можна спробувати упакувати текст).

По-друге, властивість DisplayMemberBinding встановлюється з використанням повнофункціонального вираження прив'язки, яке підтримує всі можливості, в тому числі форматування рядків і конвертери значень.

Зміна розміру стовпців

Спочатку GridView робить кожен стовпець настільки широким, наскільки необхідно для того, щоб в ньому могло вміститися саме більше видиме значення. Однак розмір будь-якого стовпця можна легко змінити, клацнувши і перетягнувши край його заголовка. Двічі клацнувши на краї заголовка стовпця, можна змусити GridViewColumn змінити свій розмір самостійно на підставі будь-якої відомої в ньому в поточний момент вмісту.

Наприклад, в разі виявлення під час прокручування списку вниз елемента, усіченого через невідповідність його розміру ширині стовпчика, можна просто двічі клацнути на правому краї заголовка цього стовпчика, і стовпець автоматично розшириться належним чином.

Це просто визначає початковий розмір стовпчика. На можливість користувача змінювати розмір стовпчика описаними вище способами це ніяк не впливає. На жаль, властивості начебто MaxWidth і MinWidth клас GridViewColumn не підтримує, так що обмежити межі, до яких користувач може змінювати розміри стовпців, не можна. Єдиний варіант - надати новий шаблон для заголовка GridViewColumn і взагалі відключити можливість зміни його розміру.