动态设置每个节点的图像

Dynamically set image of each node

所以我的 TreeView 中有 3 级节点:

我正在尝试使用 DataTemplate 将显示图像动态分配给每个节点,具体取决于其 级别 。由于级别在 WPF 中不像在 WinForms 中那样容易获得,我只是使用 Tag 属性 of TreeViewItems 来存储它们的级别。然后我写了下面的 Style 用于分配显示图像:

<Style TargetType="{x:Type TreeViewItem}">
    <Setter Property="HeaderTemplate">
        <Setter.Value>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <Image Name="img" Width="20" Height="20" Stretch="Fill">
                        <Image.Style>
                            <Style TargetType="{x:Type Image}">
                                <Style.Triggers>
                                    <DataTrigger Binding="{Binding Tag}" Value="0">
                                        <Setter Property="Source" Value="Icons\Image1.png"/>
                                    </DataTrigger>
                                    <DataTrigger Binding="{Binding Tag}" Value="1">
                                        <Setter Property="Source" Value="Icons\Image2.png"/>
                                    </DataTrigger>
                                </Style.Triggers>
                            </Style>
                        </Image.Style>
                    </Image>
                    <TextBlock VerticalAlignment="Center" Text="{Binding}" Margin="5,0" />
                </StackPanel>
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>

是的,你猜对了;它不起作用。有人可以确定问题出在哪里吗?还是我做错了?

现在,您的{Binding Tag} 将尝试查找 TreeViewItem 的 DataContext 的标签 属性,而不是 DependencyProperty。因为,我猜,DataContext 中没有 Tag 属性,所以它不会工作。如果您在 VS 中查看输出 Windows,您应该会看到到处都是绑定错误。

您需要做的是将相关源添加到您的绑定中,以便它查看 TreeViewItem 而不是 DataContext。这是一个例子:

<DataTrigger Binding="{Binding Path=Tag, RelativeSource={RelativeSource AncestorType={x:Type TreeViewItem}}}" Value="0">