TreeViewItem-Image取决于孩子

时间:2014-06-05 07:44:41

标签: c# wpf treeview

我的TreeView有以下风格:

<Style TargetType="TreeViewItem">
    <Setter Property="HeaderTemplate">
        <Setter.Value>
            <DataTemplate>
                <StackPanel>
                    <Image Width="16" Height="16"/>
                     <Label Content="{TemplateBinding Content}"/>
                </StackPanel>
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>

TreeView定义为:

<TreeView>
    <TreeViewItem Header="Pages">
        <TreeViewItem Header="Google"/>
        <TreeViewItem Header="Stackoverflow"/>
    </TreeViewItem>
    <TreeViewItem Header="Stuff">
        <TreeViewItem Header="MyDomain"/>
        <TreeViewItem Header="Other Domains">
            <TreeViewItem Header="Domain 1"/>
            <TreeViewItem Header="Domain 2"/>
            <TreeViewItem Header="Domain 3"/>
        </TreeViewItem>
    </TreeViewItem>
</TreeView>

现在我想在HeaderTemplate中设置图像。如果TreeViewItem有子节点,我想要的图像与没有子节点的图像不同。

图像位于静态类ImageSources中。如果我输入:

<Image Width="16" Height="16" Source="{x:Static helper:ImageHelper.TreeFolder}"/>

它运作正常。但是所有TreeViewItems都拥有相同的图像。

所以我考虑编写转换器并将其用作源:

<Image Width="16" Height="16" Source="{Binding Converter={StaticResource treeImageConverter}"/>

我现在的问题是:如何在我的转换器中检测当前TreeViewItem是否有孩子?我试图将它作为ConverterParameter传递但我不知道如何在DataTemplate中正确设置它。

1 个答案:

答案 0 :(得分:2)

一种方法是使用Style分配ImageDataTrigger控件来检查TreeViewItem.HasItems属性:

<Style TargetType="{x:Type Image}" x:Key="ImageForTreeViewItem">
    <Setter Property="Source" Value="{x:Static helper:ImageHelper.Image1}" />
    <Style.Triggers>
        <DataTrigger Binding="{Binding HasItems, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type TreeViewItem}}}" Value="True" >
            <Setter Property="Source" Value="{x:Static helper:ImageHelper.Image2}" />
        </DataTrigger>
    </Style.Triggers>
</Style>