WPF datagrid列标题跨越多个列

Sam*_*ted 4 wpf datagrid

在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的列标题.

任何帮助或想法将不胜感激.

D'H*_*Hag 5

这是一个老线程,但我想我应该分享我是如何做到的.

在我的应用程序中,我想在单个列标题"维护费用日期"下显示三列日期条目.我创建了一个列,其中包含两个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)