如何扩大约束和样式化TreeViewItem节点

时间:2010-10-15 12:51:18

标签: wpf silverlight treeview styles

我在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

1 个答案:

答案 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)。