2015-02-10 21 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(); 
    } 
} 
相關問題