У меня возникли проблемы с изменением DataTemplate, который используется для TreeViewItem, когда он выбран. В идеале я хотел бы, чтобы каждый элемент содержал TextBlock
, а затем, когда он выбран, он должен содержать вместо этого TextBox
.
Вот что у меня есть до сих пор (я использовал этот вопрос в качестве отправной точки):
<Window>
<Window.Resources>
<HierarchicalDataTemplate x:Key="normal"
ItemsSource="{Binding Path=Children}">
<TextBlock Text="{Binding Path=Text}" />
</HierarchicalDataTemplate>
<HierarchicalDataTemplate x:Key="selected"
ItemsSource="{Binding Path=Children}">
<TextBox Text="{Binding Path=Text}" />
</HierarchicalDataTemplate>
<Style TargetType="{x:Type TreeViewItem}" x:Key="ContainerStyle">
<Setter Property="ItemTemplate" Value="{StaticResource normal}" />
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="ItemTemplate" Value="{StaticResource selected}" />
</Trigger>
</Style.Triggers>
</Style>
</Window.Resource>
<Grid>
<TreeView ItemSource="{Binding Body}" ItemContainerStyle="{StaticResource ContainerStyle}" />
</Grid>
</Window>
Что происходит, так это то, что в дереве есть только один узел, а текст узла - это имя типа объекта. Похоже, что тип, привязанный к узлу, не соответствует ожиданиям шаблона, поэтому он использует привязку по умолчанию ToString()
вместо свойства Text
, как я указал.
Я установил DataContext окна в коде файла. Я знаю, что мои привязки для данных верны, потому что, если я установил один HierarchicalDataTemplate
для TreeView, данные будут отображаться правильно.
Я думаю, что моя проблема в том, что мне нужно установить свойство, отличное от ItemTemplate
, в стилях TreeViewItem
- я использую правильное свойство или мне нужно установить что-то другое?