Чтобы сделать то, что вы хотите, вы можете изменить ItemContainerStyle
из TreeView
:
<TreeView>
<TreeView.ItemContainerStyle>
<Style TargetType="TreeViewItem">
<Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}"/>
</Style>
</TreeView.ItemContainerStyle>
</TreeView>
Затем ваша модель представления (модель представления для каждого элемента в дереве) должна быть выставленалогическое IsSelected
свойство.
Если вы хотите иметь возможность контролировать расширение определенного TreeViewItem
, вы также можете использовать установщик для этого свойства:
<Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}"/>
Ваше мнениеЗатем -model должен предоставить логическое свойство IsExpanded
.
Обратите внимание, что эти свойства работают в обоих направлениях, поэтому, если пользователь выбирает узел в дереве, свойство IsSelected
модели представления будет установлено направда.С другой стороны, если вы установите IsSelected
в true для модели представления, будет выбран узел в дереве для этой модели представления.И также с расширенным.
Если у вас нет модели представления для каждого элемента в дереве, тогда вы должны получить его.Отсутствие модели представления означает, что вы используете объекты модели в качестве моделей представления, но для этого для работы этих объектов требуется свойство IsSelected
.
Чтобы предоставить свойство SelectedItem
в родительском представлении-модель (тот, который вы привязываете к TreeView
и который имеет коллекцию дочерних моделей представления), вы можете реализовать его так:
public ChildViewModel SelectedItem {
get { return Items.FirstOrDefault(i => i.IsSelected); }
}
Если вы не хотите отслеживатьдля выбора каждого отдельного элемента в дереве вы все равно можете использовать свойство SelectedItem
в TreeView
.Тем не менее, чтобы сделать это в стиле «MVVM», вам нужно использовать поведение Blend (доступно в виде различных пакетов NuGet - поиск «blend интерактивность»).
Здесь я добавил EventTrigger
, которыйВызывайте команду каждый раз, когда выбранный элемент изменяется в дереве:
<TreeView x:Name="treeView">
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectedItemChanged">
<i:InvokeCommandAction
Command="{Binding SetSelectedItemCommand}"
CommandParameter="{Binding SelectedItem, ElementName=treeView}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</TreeView>
Вам нужно будет добавить свойство SetSelectedItemCommand
в DataContext
из TreeView
, возвращающего ICommand
.Когда выбранный элемент древовидного представления изменяется, вызывается метод Execute
для команды с выбранным элементом в качестве параметра.Самый простой способ создания команды - это, вероятно, использовать DelegateCommand
(Google, чтобы получить реализацию, поскольку она не является частью WPF).
Возможно, лучшая альтернатива, которая позволяет двустороннее связывание без неуклюжихкоманда должна использовать BindableSelectedItemBehavior , предоставленный Стивом Грейтрексом здесь при переполнении стека.