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 містить прив'язку, яку видобувають із кожного елемента даних підлягає відображенню фрагмент інформації.
Нижче наведено код розмітки, необхідний для визначення трьох використовуваних в цьому прикладі стовпців:

Тут є кілька важливих моментів, на які варто звернути увагу. По-перше, розмір жодного з стовпців не є жорстко закодованим. Замість цього GridView встановлює розмір стовпців відповідно до розміру самого широкого видимого елемента (чи шпальти заголовка, якщо той займає більше місця в ширину), що цілком логічно для заснованого на гнучкій компонуванні світу WPF. (Звичайно, при наявності величезних значень стовпців це трохи ускладнює справу. В такому випадку можна спробувати упакувати текст).
По-друге, властивість DisplayMemberBinding встановлюється з використанням повнофункціонального вираження прив'язки, яке підтримує всі можливості, в тому числі форматування рядків і конвертери значень.
Зміна розміру стовпців
Спочатку GridView робить кожен стовпець настільки широким, наскільки необхідно для того, щоб в ньому могло вміститися саме більше видиме значення. Однак розмір будь-якого стовпця можна легко змінити, клацнувши і перетягнувши край його заголовка. Двічі клацнувши на краї заголовка стовпця, можна змусити GridViewColumn змінити свій розмір самостійно на підставі будь-якої відомої в ньому в поточний момент вмісту.
Наприклад, в разі виявлення під час прокручування списку вниз елемента, усіченого через невідповідність його розміру ширині стовпчика, можна просто двічі клацнути на правому краї заголовка цього стовпчика, і стовпець автоматично розшириться належним чином.
Це просто визначає початковий розмір стовпчика. На можливість користувача змінювати розмір стовпчика описаними вище способами це ніяк не впливає. На жаль, властивості начебто MaxWidth і MinWidth клас GridViewColumn не підтримує, так що обмежити межі, до яких користувач може змінювати розміри стовпців, не можна. Єдиний варіант - надати новий шаблон для заголовка GridViewColumn і взагалі відключити можливість зміни його розміру.