Robin
Robin

Reputation: 1587

WPF datagrid header above headers

So I'm trying to make this datagrid a bit more organized:

datagrid

Currently I'm binding data from a Json file which is hapening in th C# code. Now I Don't want to keep writing "pilot x", "pilot y", etc... And keep repeating myself in here. So I was wondering if it is possible to "add" a header above the current headers. So let's say, we have "voornaam", "achternaam" "club" and "licentie" under one header, the next "voornaam", "achternaam", "club", "licentie" also under a header and then "merk", "type" and "nummerplaat" also.

The "header" I mean is something like this;

Header example

Below you can find the code of the XAML page;

<Grid>
        <DataGrid x:Name="list_participants" ColumnHeaderStyle="{StaticResource HeaderStyle}" ColumnWidth="Auto" RowBackground="Transparent" Foreground="#fafafa" AlternatingRowBackground="#555a62" Background="Transparent" BorderThickness="0" AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Team nummer" Binding="{Binding team_number}" />
                <DataGridTextColumn Header="Voornaam" Binding="{Binding team_data.pilot.firstname}" />
                <DataGridTextColumn Header="Achternaam" Binding="{Binding team_data.pilot.lastname}" />
                <DataGridTextColumn Header="Club" Binding="{Binding team_data.pilot.club}" />
                <DataGridTextColumn Header="Licentie" Binding="{Binding team_data.pilot.license}" />
                <DataGridTextColumn Header="Voornaam" Binding="{Binding team_data.navigator.firstname}" />
                <DataGridTextColumn Header="Achternaam" Binding="{Binding team_data.navigator.lastname}" />
                <DataGridTextColumn Header="Club" Binding="{Binding team_data.navigator.club}" />
                <DataGridTextColumn Header="Licentie" Binding="{Binding team_data.navigator.license}" />
                <DataGridTextColumn Header="Merk" Binding="{Binding car_data.brand}" />
                <DataGridTextColumn Header="Type" Binding="{Binding car_data.type}" />
                <DataGridTextColumn Header="Nummerplaat" Binding="{Binding car_data.license_plate}" />
                <DataGridTemplateColumn Header="Toegelaten tot start">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <CheckBox IsChecked="{Binding allowed_to_start}"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
                <DataGridTemplateColumn Header="Uit koers genomen">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <CheckBox IsChecked="{Binding took_out_of_race}"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>

Upvotes: 4

Views: 4696

Answers (1)

M Kloster
M Kloster

Reputation: 698

You can just put an extra Grid above the DataGrid for the extra headers and bind column widths:

        <StackPanel>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="{Binding ElementName=A1, Path=ActualWidth, Mode=OneWay}"/>
                    <ColumnDefinition Width="{Binding ElementName=B1, Path=ActualWidth, Mode=OneWay}"/>
                    <ColumnDefinition Width="{Binding ElementName=C1, Path=ActualWidth, Mode=OneWay}"/>
                    <ColumnDefinition Width="{Binding ElementName=A2, Path=ActualWidth, Mode=OneWay}"/>
                    <ColumnDefinition Width="{Binding ElementName=B2, Path=ActualWidth, Mode=OneWay}"/>
                    <ColumnDefinition Width="{Binding ElementName=C2, Path=ActualWidth, Mode=OneWay}"/>
                    <ColumnDefinition Width="{Binding ElementName=A3, Path=ActualWidth, Mode=OneWay}"/>
                    <ColumnDefinition Width="{Binding ElementName=B3, Path=ActualWidth, Mode=OneWay}"/>
                    <ColumnDefinition Width="{Binding ElementName=C3, Path=ActualWidth, Mode=OneWay}"/>
                </Grid.ColumnDefinitions>
                <Label Grid.ColumnSpan="3" Grid.Column="0" Content="First dude"/>
                <Label Grid.ColumnSpan="3" Grid.Column="3" Content="Second dude"/>
                <Label Grid.ColumnSpan="3" Grid.Column="6" Content="Third dude"/>
            </Grid>
            <DataGrid>
                <DataGrid.Columns>
                    <DataGridTextColumn x:Name="A1" Header="First"/>
                    <DataGridTextColumn x:Name="B1" Header="B"/>
                    <DataGridTextColumn x:Name="C1" Header="C"/>
                    <DataGridTextColumn x:Name="A2" Header="First"/>
                    <DataGridTextColumn x:Name="B2" Header="B"/>
                    <DataGridTextColumn x:Name="C2" Header="C"/>
                    <DataGridTextColumn x:Name="A3" Header="First"/>
                    <DataGridTextColumn x:Name="B3" Header="B"/>
                    <DataGridTextColumn x:Name="C3" Header="C"/>
                </DataGrid.Columns>
            </DataGrid>
        </StackPanel>

Of course, the extra headers won't count as part of the DataGrid with respect to context menu and such; all that stuff must be added manually if you need it.

Upvotes: 8

Related Questions