如何使用 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 与计数或长度 属性,但最好能看到确切的东西)
对于在运行时解析的所有不同绑定,必须有办法调查我要绑定的确切类型,对吗?我怎样才能找到它?
您可以获得 DataGridCellsPanel
的 Children 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();
}
}
设置 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 与计数或长度 属性,但最好能看到确切的东西)
对于在运行时解析的所有不同绑定,必须有办法调查我要绑定的确切类型,对吗?我怎样才能找到它?
您可以获得 DataGridCellsPanel
的 Children 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();
}
}