Это очень просто сделать, если вы знаете, как.
Создайте класс модели представления (я назвал его CheckableItem
здесь) для ваших данных элемента представления дерева. Ему нужны эти три вещи:
- Он должен реализовывать INotifyPropertyChanged.
- Требуется свойство
Children
типа ObservableCollection<CheckableItem>
.
- Ему необходимо свойство
IsChecked
типа Visibility
, которое в своем установщике вызывает PropertyChanged
, а также выполняет итерацию по элементам в Children
и устанавливает их свойство IsChecked
.
Реализуйте другие свойства в этом классе, чтобы выставить данные элементов для привязки (в моем примере просто предполагается что-то, называемое Value
). Или вы можете просто реализовать класс Item
типа object
и использовать ContentPresenter
в шаблоне, но я оставлю это для вас.
Теперь создайте HierarchicalDataTemplate
для вашего класса, который будет выглядеть примерно так:
<HierarchicalDataTemplate
DataType="{x:Type local:CheckableItem}"
ItemsSource="{Binding Children}">
<StackPanel Orientation="Horizontal">
<CheckBox IsChecked="{Binding IsChecked}"/>
<TextBlock Text="{Binding Value}"/>
</StackPanel>
</HierarchicalDataTemplate>
... и TreeView
, который его использует (я предполагаю, что вы, разумеется, заполнили коллекцию этих объектов):
<TreeView ItemsSource="{Binding MyCollectionOfCheckableItems}"/>
Как это работает: TreeView
использует HierarchicalDataTemplate
для рендеринга каждого элемента в его ItemsSource
. HierarchicalDataTemplate
- это шаблон, который создает HeaderedItemsControl
(в данном случае TreeViewItem
), использует его шаблон для визуализации заголовка, а затем использует его ItemsSource
в качестве источника для элементов элемента управления - что, поскольку они все CheckableItem
с превращаются в TreeViewItem
с HierarchicalDataTemplate
. После этого все черепахи вниз.
Этот является довольно хорошим обзором того, как на самом деле работает TreeView
, хотя, как и в большинстве примеров, которые я нашел, в нем так много наворотов, что трудно понять, как простыми основными принципами являются. Если вы понимаете MVVM, предыдущий абзац составляет 90% того, что вам нужно знать.