在WPF数据网格中是否可以对列标题进行分组?
我所追求的是
| Column 1 | Column 2 | Column 3|
| a b c | a b c | a b c |
| z x y | z x y | z x y |
Run Code Online (Sandbox Code Playgroud)
我四处搜寻,看不到明显的做法.我可以使用模板化的列,然后模仿每个模板中的额外单元格,但这不适用于订购等.
我想我所说的一切,我正在寻找的是人们如何设法跨越多个coluns的列标题.
任何帮助或想法将不胜感激.
这是一个老线程,但我想我应该分享我是如何做到的.
在我的应用程序中,我想在单个列标题"维护费用日期"下显示三列日期条目.我创建了一个列,其中包含两个DataTemplates,一个用于显示,另一个用于编辑:
<DataGrid.Resources>
<DataTemplate x:Key="cellTemplate">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100" />
<ColumnDefinition Width="100" />
<ColumnDefinition Width="100" />
</Grid.ColumnDefinitions>
<TextBlock x:Name="tbDate1"
Text="{Binding Path=Date1}"
Grid.Column="0" />
<TextBlock x:Name="tbDate2"
Text="{Binding Path=Date2}"
Grid.Column="1" />
<TextBlock x:Name="tbDate3"
Text="{Binding Path=Date3}"
Grid.Column="2" />
</Grid>
</DataTemplate>
<DataTemplate x:Key="cellEditingTemplate">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100" />
<ColumnDefinition Width="100" />
<ColumnDefinition Width="100" />
</Grid.ColumnDefinitions>
<DatePicker Grid.Column="0"
Margin="0"
Name="dpDate1"
Width="100"
SelectedDate="{Binding Path=Date1}" />
<DatePicker Grid.Column="1"
Margin="0"
Name="dpDate2"
Width="100"
SelectedDate="{Binding Path=Date2}" />
<DatePicker Grid.Column="2"
Margin="0"
Name="dpDate3"
Width="100"
SelectedDate="{Binding Path=Date3}" />
</Grid>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)
然后我将列定义为DataGridTemplateColumn,指向上面的DataTemplates:
<DataGrid.Columns>
....
<DataGridTemplateColumn CellTemplate="{StaticResource cellTemplate}"
Header="Maintenance Fee Dates"
CellEditingTemplate="{StaticResource cellEditingTemplate}" />
....
</DataGrid.Columns>
Run Code Online (Sandbox Code Playgroud)
由于DataTemplate是使用具有三个固定长度列的Grid布局的,因此在单列标题下我会得到三个很好的日期列(或编辑时的DatePickers).
水平网格线可以由网格处理.要在三列之间使用垂直网格线,只需将中间列的控件放在边框控件中即可.将Border控件设置为与Grid列相同的宽度,仅显示其右边框和左边框,并将其BorderBrush设置为与DataGrid的Gridlines的颜色相匹配:
<DataTemplate x:Key="cellTemplate">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100" />
<ColumnDefinition Width="100" />
<ColumnDefinition Width="100" />
</Grid.ColumnDefinitions>
<TextBlock x:Name="tbDate1"
Text="{Binding Path=Date1}"
Grid.Column="0" />
<Border BorderThickness="1,0,1,0"
BorderBrush="DarkGray"
Width="100">
<Border.Child>
<TextBlock x:Name="tbDate2"
Text="{Binding Path=Date2}"
Grid.Column="1" />
</Border.Child>
</Border>
<TextBlock x:Name="tbDate3"
Text="{Binding Path=Date3}"
Grid.Column="2" />
</Grid>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)