Найти в Дзене

Создание WPF-коллекций с переменным числом элементом. ListBox со множественным выбором

Оглавление

Всем привет! Сегодня мы научимся делать ListBox со множественным выбором, подключим его к Revit, и выполним определённые действия только для выбранных элементов. Поехали!

Задача

Создать окно со списком уровней из проекта. Можно выделить несколько уровней в любом порядке. При нажатии на кнопку запуска для выбранных уровней записать в параметр определённое значение, а для невыбранных — пустую строку.

Поскольку у уровней нет параметра "Комментарии", я запишу в IFCGuid. Да, практического смысла мало, но суть в том, чтобы выполнить действия с несколькими выбранными элементами, а что именно сделать — вы для себя разберётесь сами.

Решение

Напишем простейшей класс для описания уровня. Он будет содержать 2 свойства: сам уровень (инициализируемый в конструкторе) и свойство IsChecked, показывающее, выбран он или нет.

Я тут пользуюсь ObservableProperty из Community.Toolkit. Подробнее о нём тут. Если вы не подружились с генераторами кода, то можете написать обычные свойства и команды, как здесь.

Далее заполним основную ViewModel:

Соберём все уровни и превратим их в LevelDescriptor с помощью Select из LINQ:

-2

И напишем простую команду, которая будет менять значение параметра, в зависимости от значения IsChecked

-3

Отлично, вьюМодель готова. Теперь подготовим наше окно. В принципе, я уже писал, как заполнить ComboBox набором значений с помощью ItemSource, но здесь задача сложнее, ведь у ListBox нет переменной SelectedItem.

Окно получилось вот таким:

-4

Сначала я создал строки с помощью контейнера Grid. Затем в первую строку я поместил ListBox. Строка SelectionMode="Multiple" отвечает за то, чтобы мы могли выбрать несколько элементов.

А вот строки 20-24 связывают свойство IsSelected каждой строки (точнее, каждого элемента ListBoxItem) со свойcтвом IsChecked нашего LevelDescriptor. В общем, то самое, что позволяет нам делать множественный выбор и обновлять его во ViewModel.

Результат

Множественный выбор работает:

-5

Команда срабатывает на нужные элементы:

-6

А на этом на сегодня всё. В следующей статье мы научимся создавать шаблоны для отображения элементов списка и решим такую же задачу, но другим способом: не выбирая элементы в списке, а отмечая их галочкой.

Итоговый код в моём репозитории на GitHub. Не забывайте ставить мне там звёздочки, и, конечно же, подписывайтесь на мой телеграм-канал о Revit API. До новых встреч!

-7