В зависимости от точной семантики, которую вы хотите, решение может быть очень простым:
Если корень вашего дерева не является TreeView
- например, если это обычный ItemsControl
- все TreeViewItems в дереве будут независимо выбираемыми, так что вы, по сути, получаете mulitiselect бесплатно. Поэтому просто используйте ItemsControl
вместо TreeView
для корня дерева.
Преимущество этого решения в том, что его чрезвычайно просто реализовать. Оно отличается от решения mattdlong тем, что:
Еще одно различие заключается в том, что навигация по клавиатуре (клавиши со стрелками) в его решении отменяет выбор всех элементов, в то время как в этом решении навигация по клавиатуре не отменяет выбор элементов.
Вы должны выбирать между этими решениями, основываясь на семантике, которую вы предпочитаете (одиночный щелчок для добавления элемента против нажатия клавиши Ctrl для добавления элемента и т.д.). Если вам нужна более продвинутая семантика, такая как Shift-Click и т.д., то можно добавить.
Обратите внимание, что вы также можете создать собственный стиль TreeViewItems, используя ToggleButton
или CheckBox
в любом месте ItemContainerTemplate
, который имеет Checked={Binding IsSelected}
. Это позволяет пользователю выбирать элементы, нажимая на ToggleButton
или CheckBox
.