【问题标题】:Dynamically set image of each node动态设置每个节点的图像
【发布时间】:2015-08-07 07:53:15
【问题描述】:

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

  • 单个根节点(应显示 Image1.png)
  • 一些二级节点(应显示 Image2.png)
  • 每个二级节点都有一些三级节点(应显示Image3.png)

我正在尝试使用DataTemplate 将显示图像动态分配给每个节点,具体取决于其级别。由于 WPF 中的级别不像 WinForms 中那样容易获得,我只是使用TreeViewItems 的Tag 属性来存储他们的级别。然后我在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>

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

【问题讨论】:

  • 标签不是 TreeViewItem 的 DataContext 中对象的属性。您应该在{Binding Tag} 上设置一个RelativeSource。
  • @Clemens:我将其更改为Binding="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Tag}",但它仍然没有显示任何内容。

标签: wpf xaml treeview datatemplate datatrigger


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-08
    • 2015-07-23
    • 1970-01-01
    • 2011-01-13
    • 2017-04-27
    • 1970-01-01
    • 1970-01-01
    • 2012-10-04
    相关资源
    最近更新 更多