Wpf, listbox і combobox

клас ListBox

Клас ListBox представляє поширений компонент середовища Windows - списки змінної довжини, які дозволяють користувачеві вибрати один з елементів.

Клас ListBox дозволяє це, якщо його властивості SelectionMode привласнити значення Multiple або Extended. У режимі Multiple можна вибрати будь-який елемент або скасувати його вибір, клацнувши на ньому. У режимі Extended необхідно притиснути клавішу , щоб вибрати додаткові елементи, або клавішу , щоб вибрати діапазон елементів. У будь-якому вигляді списку з множинним вибором для отримання всіх виділених елементів замість властивості SelectedItem використовується колекція SelectedItems.

Різні елементи управління обробляють вкладене в них вміст по-різному. Об'єкт ListBox зберігає всі вкладені об'єкти в своїй колекції Items.

ListBox є досить гнучким елементом управління. Він може зберігати не тільки об'єкти ListBoxItem, але і будь-які довільні елементи. Адже клас ListBoxItem є спадкоємцем класу ContentControl, який дозволяє зберігати фрагменти вкладеного вмісту. Якщо такий фрагмент є класом, породженим від UIElement, то він буде відображений в елементі ListBox. Якщо ж це інший тип об'єкта, ListBox викличе метод ToString () і виведе отриманий текст. наприклад:

Wpf, listbox і combobox

З прикладу видно, що об'єкти ListBox здатні неявно створювати необхідні їм об'єкти ListBoxItem. Це означає, що об'єкти можете поміщати прямо всередину елемента ListBox.

Можливість заносити в списки довільні елементи дозволяє створювати різні засновані на списку елементи управління, не використовуючи при цьому інші класи. Наприклад, в Windows Forms є спеціальний клас CheckedListBox, що відображається як список з прапорцями біля кожного елемента. У WPF для цього не потрібен ніякий спеціальний клас, оскільки його можна швидко створити за допомогою стандартного об'єкта ListBox.

При використанні списку, що містить різні елементи, майте на увазі, що при зчитуванні значення SelectedItem (а також колекцій SelectedItems і Items) ви не побачите об'єкти ListBoxItem - замість них ви побачите ті об'єкти, які занесені в список. У прикладі з елементом CheckedListBox це означає, що SelectedItem надає об'єкт CheckBox.

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

Аналогічно, властивість AddedItems повідомляє, які елементи були додані в число вибраних. У режимі вибору одного елемента при зміні вибору завжди може бути доданий лише один елемент, і віддалений теж тільки один елемент. У режимі множинного вибору або в розширеному режимі так буває не завжди.

У класі ListBoxItem є невелика додаткова можливість: в ньому визначено властивість IsSelected. значення якого можна зчитувати (або встановлювати), і події Selected і Unselected, які повідомляють про виділення даного елемента. Однак схожі можливості можна отримати за допомогою членів класу ListBox - властивості SelectedItem (або SelectedItems) і події SelectionChanged.

клас ComboBox

Елемент ComboBox схожий на елемент ListBox. Він зберігає колекцію об'єктів ComboBoxItem, які створюються явним або неявним чином. Як і ListBoxItem, ComboBoxItem є елементом управління вмістом, який може зберігати будь-який вкладений елемент.

Основною відмінністю класів ComboBox і ListBox є спосіб їх відображення в вікні. Елемент ComboBox використовує список, що розкривається, а це значить, що за один раз можна вибрати тільки один елемент.

Якщо потрібно зробити так, щоб користувач міг вибрати елемент в ComboBox, ввівши текст в текстовому полі, необхідно привласнити властивості IsEditable значення true. Крім того, потрібно зберігати тільки звичайні текстові об'єкти ComboBoxItem або об'єкти з осмисленим поданням ToString (). Наприклад, якщо заповнити редагований список, що розкривається об'єктами Image, то текст, який з'явиться у верхній частині, буде повністю визначений ім'ям класу Image, а це навряд чи те, що треба.

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

Wpf, listbox і combobox

Схожі статті