3

我尝试使用 TreeView 显示分层数据,并且我想为我的不同儿童类型设置不同的 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>
4

2 回答 2

4

好的,我知道出了什么问题。HierarchicalDataTemplate.ItemContainerStyle包含一种样式,该样式应用于 ItemsContainer,其中存储了当前节点的子项。尝试将此作为实验,将您的样式更改为:

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

您会注意到,您放置此样式的节点继续具有黑色前景,但它的所有节点现在都将具有 Navy 的前景。

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

于 2015-08-24T10:10:43.943 回答
0

我可能有类似的问题。如果 Main、Type2 和 Type3 是 XAML 中的选择不起作用的接口,我必须使用类。如果你想使用接口,你可以实现一个模板选择器。

于 2015-08-24T09:12:47.793 回答