ListBox и ComboBox

70

Класс ListBox

Класс ListBox представляет распространенный компонент среды Windows — списки переменной длины, которые позволяют пользователю выбрать один из элементов.

Класс ListBox допускает множественный выбор, если его свойству SelectionMode присвоить значение Multiple или Extended. В режиме Multiple можно выбрать любой элемент или отменить его выбор, щелкнув на нем. В режиме Extended необходимо прижать клавишу <Ctrl>, чтобы выбрать дополнительные элементы, или клавишу <Shift>, чтобы выбрать диапазон элементов. В любом виде списка с множественным выбором для получения всех выделенных элементов вместо свойства SelectedItem используется коллекция SelectedItems.

Разные элементы управления обрабатывают вложенное в них содержимое по-разному. Объект ListBox хранит все вложенные объекты в своей коллекции Items.

ListBox является довольно гибким элементом управления. Он может хранить не только объекты ListBoxItem, но и любые произвольные элементы. Ведь класс ListBoxItem является наследником класса ContentControl, который позволяет хранить фрагменты вложенного содержимого. Если такой фрагмент является классом, порожденным от UIElement, то он будет отображен в элементе ListBox. Если же это другой тип объекта, ListBox вызовет метод ToString() и выведет полученный текст. Например:

<ListBox Margin="5">
      <StackPanel Margin="5" Orientation="Horizontal">
                <Image Source="apple.png" Width="50"></Image>
                <Label VerticalContentAlignment="Center">Яблоко</Label>
      </StackPanel>
      <StackPanel Margin="5" Orientation="Horizontal">
                <Image Source="kiwi.png" Width="50"></Image>
                <Label VerticalContentAlignment="Center">Киви</Label>
      </StackPanel>
      <StackPanel Margin="5" Orientation="Horizontal">
                <Image Source="lemon.png" Width="50"></Image>
                <Label VerticalContentAlignment="Center">Лимон</Label>
      </StackPanel>
</ListBox>
ListBox

Из примера видно, что объекты 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, что очень неудобно.

ComboBox
Пройди тесты
Лучший чат для C# программистов