我在WPF中有一个TreeView,我已经绑定了一个类别的集合,这些类别本身包含一系列类别和儿子等等。目前,我正在成功绑定该集合并出现所有类别名称。但是,我在我的集合对象上也有一个IsExpanded属性,当所有设置为true时,只展开第一个TreeViewItem但没有后续的TreeViewItem。
有谁知道我的TreeView样式可能出错?
<HierarchicalDataTemplate x:Key="menuHierarchicalTemplate" ItemsSource="{Binding Path=SubCategories, Mode=TwoWay}" >
<Border x:Name="treeViewItemBorder"
CornerRadius="3"
MinWidth="125"
BorderBrush="Silver" Background="Transparent">
<StackPanel Orientation="Horizontal" >
<TextBlock Height="24" Padding="5" Text="{Binding Path=Name}" />
</StackPanel>
</Border>
</HierarchicalDataTemplate>
<Style x:Key="treeViewItemStyle" TargetType="TreeViewItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="TreeViewItem">
<TreeViewItem IsExpanded="{Binding Path=IsExpanded, Mode=TwoWay}"
ItemsSource="{Binding Path=SubCategories}"
ItemTemplate="{StaticResource menuHierarchicalTemplate}" >
<TreeViewItem.Header>
<StackPanel Orientation="Horizontal" >
<TextBlock Height="24" FontSize="12" Padding="5" Text="{Binding Path=Name}" />
</StackPanel>
</TreeViewItem.Header>
</TreeViewItem>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<TreeView Name="menuTreeView"
Background="Transparent"
BorderBrush="Transparent"
VerticalAlignment="Stretch"
HorizontalAlignment="Stretch"
Margin="10"
ItemContainerStyle="{StaticResource treeViewItemStyle}">
</TreeView>
谢谢,
XAM
答案 0 :(得分:1)
您只将“treeViewItemStyle”应用于TreeView中的第一级项目。您必须设置它以及TreeViewItems的ItemContainerStyle。因此,在ControlTemplate中,您需要以下内容:
<ControlTemplate TargetType="TreeViewItem">
<TreeViewItem ItemContainerStyle="{StaticResource treeViewItemStyle}".../>
</ControlTemplate>
更好的是,您可以在样式声明中删除“x:Key”属性。这样做会自动将样式应用于所有 TreeViewItems。
SIDE NOTE:
我建议不要像上面那样覆盖ControlTemplate,而只需使用Style中的属性Setters。类似的东西:
<Style TargetType="TreeViewItem">
<Setter Property="IsExpanded" Value="{Binding Path=IsExpanded, Mode=TwoWay}"/>
<Setter Property="ItemsSource" Value="{Binding Path=SubCategories}"/>
<Setter Property="ItemTemplate" Value="{StaticResource menuHierarchicalTemplate}"/>
<Setter Property="Header">
<Setter.Value>
<StackPanel Orientation="Horizontal" >
<TextBlock Height="24" FontSize="12" Padding="5" Text="{Binding Path=Name}" />
</StackPanel>
</Setter.Value>
</Setter>
</Style>
将相同的Control用作ControlTemplate本身的一部分是非常不寻常的(即在TreeViewItem的ControlTemplate中使用TreeViewItem)。