代码之家  ›  专栏  ›  技术社区  ›  Dan

样式中的WPF DataGrid标头内容在每个触发器中仅显示一次

  •  2
  • Dan  · 技术社区  · 8 年前

    我的WPF数据网格出现了一个奇怪的问题 Header s的内容。该样式的XAML如下所示:

    <DataGrid.RowStyle>
        <Style TargetType="DataGridRow">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Type, Converter={StaticResource EnumToStringConverter}}" Value="Default">
                    <Setter Property="Background" Value="White"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding Type, Converter={StaticResource EnumToStringConverter}}" Value="Error">
                    <Setter Property="Background" Value="#F2DEDE"/>
                    <Setter Property="Header">
                        <Setter.Value>
                            <Image Source="{StaticResource IconError}" Width="16" Height="16"></Image>
                        </Setter.Value>
                    </Setter>
                </DataTrigger>
                <DataTrigger Binding="{Binding Type, Converter={StaticResource EnumToStringConverter}}" Value="Warning">
                    <Setter Property="Background" Value="#FCF8E3"/>
                    <Setter Property="Header">
                        <Setter.Value>
                            <Image Source="{StaticResource IconWarning}" Width="16" Height="16"></Image>
                        </Setter.Value>
                    </Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DataGrid.RowStyle>
    

    Example image of rows with missing header icons

    每个触发器似乎只显示一次图标,但由于行颜色正确,触发器显然正在触发。

    标题 s

    TextBlock

    这是怎么回事?有没有更好的方式让我错过?

    编辑:对于任何在事后发现这一点的人 StaticResource 图标是 BitmapImage 实例,而不是路径。

    2 回复  |  直到 8 年前
        1
  •  3
  •   mm8    8 年前

    UIElement 例如 Image 在视觉树中只能出现一次。

    <DataGrid>
        <DataGrid.Resources>
            <Image x:Key="errorImg" x:Shared="False" Source="{StaticResource IconError}" Width="16" Height="16"></Image>
            <Image x:Key="warnImg" x:Shared="False" Source="{StaticResource IconWarning}" Width="16" Height="16"></Image>
        </DataGrid.Resources>
        <DataGrid.RowStyle>
            <Style TargetType="DataGridRow">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Type, Converter={StaticResource EnumToStringConverter}}" Value="Default">
                        <Setter Property="Background" Value="White"/>
                    </DataTrigger>
                    <DataTrigger Binding="{Binding Type, Converter={StaticResource EnumToStringConverter}}" Value="Error">
                        <Setter Property="Background" Value="#F2DEDE"/>
                        <Setter Property="Header" Value="{StaticResource errorImg}" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding Type, Converter={StaticResource EnumToStringConverter}}" Value="Warning">
                        <Setter Property="Background" Value="#FCF8E3"/>
                        <Setter Property="Header" Value="{StaticResource warnImg}" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </DataGrid.RowStyle>
    </DataGrid>
    
        2
  •  0
  •   Dan    8 年前

    除了这里选择的答案之外,我还通过替换 Header

    <DataTrigger Binding="{Binding Type, Converter={StaticResource EnumToStringConverter}}" Value="Error">
        <Setter Property="Background" Value="#F2DEDE"/>
        <Setter Property="HeaderTemplate">
            <Setter.Value>
                <DataTemplate>
                    <Image Source="{StaticResource IconError}" Width="16" Height="16"></Image>
                </DataTemplate>
            </Setter.Value>
        </Setter>
    </DataTrigger>
    
    推荐文章