2015-02-10 15 views
3

样式化DataGrid,我想通过将触发器应用于ControlTemplate或Style来区分它的最后一个列标题。例如:如何检查DataGridColumnHeader的ColumnIndex是否是触发器的最后一个?

<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和许多其他绑定,但即使我知道使用哪一个,然后再次寻找它的内部属性? (很明显有一些具有计数或长度属性的集合,但它将很好地看到确切的东西)

由于在运行时解析所有不同的绑定,所以必须有方法来确定究竟是什么类型我要去绑定,对吧?我怎么找到它?

+0

你可能需要一个多转换器,在其中您将项目(列)的集合与此列的datacontext一起传递,然后您可以检查索引并返回true或false 。最后,让你的触发器检查其中的一个值。 – gregsdennis 2015-02-10 01:50:43

回答

0

你可以得到的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(); 
    } 
} 
相关问题