【问题标题】:WPF- How to apply LayoutTransform to a specific DataGridColumnHeaderWPF-如何将 LayoutTransform 应用于特定的 DataGridColumnHeader
【发布时间】:2016-09-04 07:29:06
【问题描述】:

我有一个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 而不是其他列的类型。有什么想法吗?

【问题讨论】:

    标签: c# wpf datatable datagrid datagridcolumnheader


    【解决方案1】:

    满足这两个条件:

    • 时间:设置 ItemSource 后翻转标题
    • 过滤器:样式只能应用于 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 的标题被翻转。请注意实现方式,将 Flip 设置为 false 不会执行任何操作,因此 Headers 不会翻转回来。

    编辑

    刚刚了解了一种更短的方法,使用AutoGeneratingColumn event

    <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");
    }
    

    【讨论】:

    • 这是一个非常好的答案。我不知道这样的事情是可能的
    【解决方案2】:

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

    如果你想要,请检查我的以下代码。

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

    最好的问候,

    梅西

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-05
      • 2013-09-16
      • 1970-01-01
      • 2012-12-04
      • 1970-01-01
      • 1970-01-01
      • 2016-04-24
      • 2011-01-02
      相关资源
      最近更新 更多