Всем привет! Сегодня мы научимся делать ListBox со множественным выбором, подключим его к Revit, и выполним определённые действия только для выбранных элементов. Поехали!
Задача
Создать окно со списком уровней из проекта. Можно выделить несколько уровней в любом порядке. При нажатии на кнопку запуска для выбранных уровней записать в параметр определённое значение, а для невыбранных — пустую строку.
Поскольку у уровней нет параметра "Комментарии", я запишу в IFCGuid. Да, практического смысла мало, но суть в том, чтобы выполнить действия с несколькими выбранными элементами, а что именно сделать — вы для себя разберётесь сами.
Решение
Напишем простейшей класс для описания уровня. Он будет содержать 2 свойства: сам уровень (инициализируемый в конструкторе) и свойство IsChecked, показывающее, выбран он или нет.
Я тут пользуюсь ObservableProperty из Community.Toolkit. Подробнее о нём тут. Если вы не подружились с генераторами кода, то можете написать обычные свойства и команды, как здесь.
Далее заполним основную ViewModel:
Соберём все уровни и превратим их в LevelDescriptor с помощью Select из LINQ:
И напишем простую команду, которая будет менять значение параметра, в зависимости от значения IsChecked
Отлично, вьюМодель готова. Теперь подготовим наше окно. В принципе, я уже писал, как заполнить ComboBox набором значений с помощью ItemSource, но здесь задача сложнее, ведь у ListBox нет переменной SelectedItem.
Окно получилось вот таким:
Сначала я создал строки с помощью контейнера Grid. Затем в первую строку я поместил ListBox. Строка SelectionMode="Multiple" отвечает за то, чтобы мы могли выбрать несколько элементов.
А вот строки 20-24 связывают свойство IsSelected каждой строки (точнее, каждого элемента ListBoxItem) со свойcтвом IsChecked нашего LevelDescriptor. В общем, то самое, что позволяет нам делать множественный выбор и обновлять его во ViewModel.
Результат
Множественный выбор работает:
Команда срабатывает на нужные элементы:
А на этом на сегодня всё. В следующей статье мы научимся создавать шаблоны для отображения элементов списка и решим такую же задачу, но другим способом: не выбирая элементы в списке, а отмечая их галочкой.
Итоговый код в моём репозитории на GitHub. Не забывайте ставить мне там звёздочки, и, конечно же, подписывайтесь на мой телеграм-канал о Revit API. До новых встреч!