WPF- 如何将 LayoutTransform 应用于特定的 DataGridColumnHeader
WPF- How to apply LayoutTransform to a specific DataGridColumnHeader
我有一个 DataGrid
,其 ItemsSource
绑定到 System.Data.DataTable
。此 DataTable
在运行时填充了一些文本列和一些布尔值列。正如预期的那样,文本列显示为 DataGridTextColumn
,布尔值显示为 DataGridCheckBoxColumn
。到目前为止没问题。现在我希望复选框列的 headers 列显示为垂直。所以我定义了这样的样式:
<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>
问题是-正如代码中所评论的那样,我不知道我应该为样式使用什么样的触发器才能将仅应用于 DataGridCheckBoxColumn
s 而不是其他类型的列。有什么想法吗?
我查看了你的代码,你为什么要使用触发器?
如果是你想要的,请检查我下面的代码。
<DataGridCheckBoxColumn.ElementStyle>
<Style TargetType="CheckBox">
<Setter Property="VerticalAlignment" Value="Center" />
</Style>
</DataGridCheckBoxColumn.ElementStyle>
此致,
梅西
要满足这两个要求:
- 时间:设置 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>
时间由翻转属性控制。每次更改 Collection 时,将 Flip 设置为 false,然后再次设置为 true。迭代列并翻转 DataGridCheckBoxColumns 的 Headers。请注意,将 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>
部分处理程序class
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");
}
我有一个 DataGrid
,其 ItemsSource
绑定到 System.Data.DataTable
。此 DataTable
在运行时填充了一些文本列和一些布尔值列。正如预期的那样,文本列显示为 DataGridTextColumn
,布尔值显示为 DataGridCheckBoxColumn
。到目前为止没问题。现在我希望复选框列的 headers 列显示为垂直。所以我定义了这样的样式:
<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>
问题是-正如代码中所评论的那样,我不知道我应该为样式使用什么样的触发器才能将仅应用于 DataGridCheckBoxColumn
s 而不是其他类型的列。有什么想法吗?
我查看了你的代码,你为什么要使用触发器?
如果是你想要的,请检查我下面的代码。
<DataGridCheckBoxColumn.ElementStyle>
<Style TargetType="CheckBox">
<Setter Property="VerticalAlignment" Value="Center" />
</Style>
</DataGridCheckBoxColumn.ElementStyle>
此致,
梅西
要满足这两个要求:
- 时间:设置 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>
时间由翻转属性控制。每次更改 Collection 时,将 Flip 设置为 false,然后再次设置为 true。迭代列并翻转 DataGridCheckBoxColumns 的 Headers。请注意,将 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>
部分处理程序class
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");
}