如何将LayoutTransform应用于特定的DataGridColumnHeader

本文关键字:DataGridColumnHeader 应用于 LayoutTransform | 更新日期: 2023-09-27 18:05:45

我有一个DataGrid,它的ItemsSource绑定在一个System.Data.DataTable上。这个DataTable在运行时被一些文本列和一些布尔列填充。如预期的那样,文本列显示为DataGridTextColumn,布尔列显示为DataGridCheckBoxColumn。到目前为止还没有问题。现在我希望复选框列的列标头显示为垂直的。所以我定义了这样一个样式:

<Style x:Key="ColumnHeaderStyle" TargetType="{x:Type DataGridColumnHeader}">
    <Style.Triggers>
        <!--<Trigger Property=??? Value=???>
            <Setter Property="LayoutTransform">
                <Setter.Value>
                    <RotateTransform Angle="270"/>
                </Setter.Value>
            </Setter>
        </Trigger>-->
    </Style.Triggers>
</Style>

问题是-正如代码中注释的那样,我不知道我应该为样式使用什么样的触发器,以便仅将应用于 DataGridCheckBoxColumns而不是其他类型的列。什么好主意吗?

如何将LayoutTransform应用于特定的DataGridColumnHeader

满足这两个条件:

  • 时序:ItemSource设置后翻转Headers
  • 过滤器:样式应该只应用于CheckBoxColumns

你可以使用附加行为:

DataGridColumnsBehavior.cs

public static class DataGridColumnsBehavior
{
    public static readonly DependencyProperty
        FlipHeaderProperty =
            DependencyProperty.RegisterAttached("FlipHeader",
                typeof(bool), typeof(DataGridColumnsBehavior),
                    new PropertyMetadata(FlipHeaderChanged));
    public static bool GetFlipHeader(DependencyObject obj)
    {
        return (bool)obj.GetValue(FlipHeaderProperty);
    }
    public static void SetFlipHeader(DependencyObject obj, bool value)
    {
        obj.SetValue(FlipHeaderProperty, value);
    }
    private static void FlipHeaderChanged(DependencyObject d,
        DependencyPropertyChangedEventArgs args)
    {
        var grid = d as DataGrid;
        var flip = (bool)grid.GetValue(FlipHeaderProperty);
        if (grid == null
         || grid.Columns.Count == 0
         || flip == false) return;
        foreach (var column in grid.Columns)
        {
            if (column.GetType() == typeof(DataGridCheckBoxColumn))
                column.HeaderStyle = 
                    (Style)grid.FindResource("CheckBoxColumnHeaderStyle");
        }
    }
}

XAML

<DataGrid ItemsSource="{Binding Collection}" 
          funk:DataGridColumnsBehavior.FlipHeader="{Binding Flip}">
    <DataGrid.Resources>
        <Style x:Key="CheckBoxColumnHeaderStyle" 
               TargetType="{x:Type DataGridColumnHeader}">
            <Setter Property="LayoutTransform">
                <Setter.Value>
                    <RotateTransform Angle="270"/>
                </Setter.Value>
            </Setter>
        </Style>
    </DataGrid.Resources>
</DataGrid>

时间由Flip属性控制。每次更改Collection时,将Flip设置为false,然后再次设置为true。列被迭代,DataGridCheckBoxColumns的header被翻转。注意,将Flip设置为false没有任何作用,因此header不会被翻转回来。

编辑

刚刚学习了一个更短的方法,使用AutoGeneratingColumn事件:

<DataGrid ItemsSource="{Binding Collection}" 
          AutoGeneratingColumn="dataGrid_AutoGeneratingColumn">
    <DataGrid.Resources>
        <Style x:Key="CheckBoxColumnHeaderStyle" 
               TargetType="{x:Type DataGridColumnHeader}">
            <Setter Property="LayoutTransform">
                <Setter.Value>
                    <RotateTransform Angle="270"/>
                </Setter.Value>
            </Setter>
        </Style>
    </DataGrid.Resources>
</DataGrid>

局部类中的处理程序

private void dataGrid_AutoGeneratingColumn(object sender,
    DataGridAutoGeneratingColumnEventArgs e)
{
    DataGrid grid = sender as DataGrid;
    // Only DataGridCheckBoxColumns
    if (e.PropertyType == typeof(bool))
        e.Column.HeaderStyle =
            (Style)grid.FindResource("CheckBoxColumnHeaderStyle");
}

我检查了你的代码,为什么你想使用触发器?

如果你需要,请检查我下面的代码。

<DataGridCheckBoxColumn.ElementStyle>
                <Style TargetType="CheckBox">
                    <Setter Property="VerticalAlignment" Value="Center" />
                </Style>
            </DataGridCheckBoxColumn.ElementStyle>

最诚挚的问候,梅西

相关文章:
  • 没有找到相关文章