Это старая ветка, но я подумал, что должен рассказать, как я это сделал.
В моем приложении я хочу отобразить три столбца записей даты под одним заголовком столбца «Даты платы за обслуживание». Я создал один столбец с двумя шаблонами данных, один для отображения и один для редактирования:
<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>
Затем я определяю столбец как DataGridTemplateColumn, указывая на приведенные выше шаблоны данных:
<DataGrid.Columns>
....
<DataGridTemplateColumn CellTemplate="{StaticResource cellTemplate}"
Header="Maintenance Fee Dates"
CellEditingTemplate="{StaticResource cellEditingTemplate}" />
....
</DataGrid.Columns>
Поскольку DataTemplate размещается с сеткой, имеющей три столбца фиксированной длины, я получаю три хороших столбца дат (или DatePickers при редактировании) под заголовком одного столбца.
Горизонтальные линии сетки могут обрабатываться сеткой. Чтобы иметь вертикальные линии сетки между тремя столбцами, просто поместите элемент управления среднего столбца в элемент управления Border. Установите для элемента управления Border ту же ширину, что и для столбца Grid, отобразите только его правую и левую границы и установите его BorderBrush в соответствии с цветом линий сетки DataGrid:
<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>