TreeView HierarchicalDataTemplate不应用ItemContainerStyle

时间:2015-08-24 08:32:46

标签: wpf xaml treeview hierarchicaldatatemplate itemcontainerstyle

我尝试使用TreeView显示分层数据,我想为不同的Children类型设置不同的DataTemplates。

但问题是,我的风格没有得到应用。

也许这是一个非常简单的错误,但我真的找不到它。

<TreeView ItemsSource="{Binding List}">
    <TreeView.Resources>
        <HierarchicalDataTemplate DataType="{x:Type local:Main}" ItemsSource="{Binding Children}">
            <TextBlock Text="{Binding Property1}"/>
        </HierarchicalDataTemplate>
        <HierarchicalDataTemplate DataType="{x:Type local:Type2}">
            <HierarchicalDataTemplate.ItemContainerStyle>
                <Style TargetType="TreeViewItem">
                    <Setter Property="IsExpanded" Value="True"/>
                </Style>
            </HierarchicalDataTemplate.ItemContainerStyle>
            <TextBlock Text="{Binding Property2}"/>
        </HierarchicalDataTemplate>
        <HierarchicalDataTemplate DataType="{x:Type local:Type3}">
            <HierarchicalDataTemplate.ItemContainerStyle>
                <Style TargetType="TreeViewItem">
                    <Setter Property="IsExpanded" Value="False"/>
                </Style>
            </HierarchicalDataTemplate.ItemContainerStyle>
        </HierarchicalDataTemplate>
    </TreeView.Resources>
</TreeView>

2 个答案:

答案 0 :(得分:4)

好的,我知道出了什么问题。 HierarchicalDataTemplate.ItemContainerStyle 包含一个应用于ItemsContainer的样式,其中存储了当前节点的 children 。试试这个实验,将你的风格改为:

    <HierarchicalDataTemplate.ItemContainerStyle>
        <Style TargetType="{x:Type TreeViewItem}">
            <Setter Property="IsExpanded" Value="True" />
            <Setter Property="Foreground" Value="Navy" />
        </Style>
    </HierarchicalDataTemplate.ItemContainerStyle>

你会注意到你把这个风格放在上面的节点继续有一个黑色的前景,但它的所有孩子现在都有一个海军的前景。

这有点违反直觉,但是当你想到它时,我想这是有道理的。因此,考虑到这一点,我认为最好的解决方案是将所有TreeViewItems的IsExpanded绑定到VM中的变量,然后根据那里的类型选择不同的值。

答案 1 :(得分:0)

我也有类似的问题。如果Main,Type2和Type3是接口,XAML中的选择将不起作用,我不得不使用类。如果要使用接口,可以实现模板选择器。