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

时间:2015-02-10 01:12:07

标签: wpf xaml

样式化DataGrid,我想通过将触发器应用于ControlTemplate或Style来区分其最后一个列标题。例如:

<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和许多其他绑定,但即使我知道使用哪一个,那么我必须在其中寻找什么属性呢? (显然有一些具有Count或Length属性的集合,但看起来确实很好)

使用在运行时解析的所有不同绑定,必须有办法调查我将要绑定的类型,对吧?我怎么能找到它?

1 个答案:

答案 0 :(得分:0)

您可以Children Count DataGridCellsPanel DataGridColumnHeaderconverter的父级,并使用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();
    }
}

转换器

{{1}}