如何使用 Trigger 检查 DataGridColumnHeader 的 ColumnIndex 是否是最后一个?

How to check if ColumnIndex of an DataGridColumnHeader is the last with Trigger?

设置 DataGrid 的样式,我想通过将触发器应用于 ControlTemplate 或 Style 来区分其最后一列 header。例如:

<Style TargetType="{x:Type DataGridColumnHeader}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="DataGridColumnHeader">
                <Grid>
                    <Border>
                        <ContentPresenter 
                            DataContext="{TemplateBinding DataContext}" 
                            Content="{Binding}" 
                            VerticalAlignment="Center"/>
                    </Border>
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="DisplayIndex" Value="{Binding ???}">

                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

但是我必须将它绑定到什么值?有 TemplateBinding、TemplatedParent 和许多其他绑定,但即使我知道要使用哪一个,那么 属性 我还必须在其中寻找什么? (显然有某种 collection 与计数或长度 属性,但最好能看到确切的东西)

对于在运行时解析的所有不同绑定,必须有办法调查我要绑定的确切类型,对吗?我怎样才能找到它?

您可以获得 DataGridCellsPanelChildren Count,它是 DataGridColumnHeader 的父级,并使用 converter 来检查 LastLevelColumn

   <local:Converter x:Key="myConverter"/>
    <Style TargetType="{x:Type DataGridColumnHeader}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="DataGridColumnHeader">
                    <Grid x:Name="gridSource">
                        <Grid.Tag>
                            <MultiBinding Converter="{StaticResource myConverter}">
                                <Binding Path="Children.Count" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGridCellsPanel}}"/>
                                <Binding Path="DisplayIndex"  RelativeSource="{RelativeSource TemplatedParent}"/>
                            </MultiBinding>
                        </Grid.Tag>
                        <Border x:Name="myBorder">
                            <ContentPresenter 
                        DataContext="{TemplateBinding DataContext}" 
                        Content="{Binding}" 
                        VerticalAlignment="Center"/>
                        </Border>
                    </Grid>
                    <ControlTemplate.Triggers>
                        <Trigger Property="Tag" SourceName="gridSource" Value="true">
                           <!-- Setter's -->
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

转换器 :

  public class Converter : IMultiValueConverter
  {
    public object Convert(object[] values, System.Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (values[0] is int && values[1] is int)
            return (int)values[0] == (int)values[1] + 1 ? "true" : "false";
        else
            return "false";
    }

    public object[] ConvertBack(object value, System.Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new System.NotImplementedException();
    }
}