WPF 数据网格 header 以上 header 秒
WPF datagrid header above headers
所以我试图让这个数据网格更有条理:
目前我正在绑定来自 Json 文件的数据,该文件在 C# 代码中正在处理。现在我不想继续写 "pilot x"、"pilot y" 等...并在这里不断重复自己。所以我想知道是否有可能在当前 header 之上 "add" 一个 header。比方说,我们有 "voornaam"、"achternaam"、"club" 和 "licentie",其中一个 header,下一个 "voornaam"、"achternaam", "club"、"licentie" 也在 header 下,然后 "merk"、"type" 和 "nummerplaat" 也在下。
"header"我的意思是这样的;
您可以在下面找到 XAML 页面的代码;
<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>
您可以在 DataGrid 上方放置一个额外的 Grid 以获得额外的 headers 并绑定列宽:
<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>
当然,关于上下文菜单等,额外的 headers 不会算作 DataGrid 的一部分;如果需要,所有这些东西都必须手动添加。
所以我试图让这个数据网格更有条理:
目前我正在绑定来自 Json 文件的数据,该文件在 C# 代码中正在处理。现在我不想继续写 "pilot x"、"pilot y" 等...并在这里不断重复自己。所以我想知道是否有可能在当前 header 之上 "add" 一个 header。比方说,我们有 "voornaam"、"achternaam"、"club" 和 "licentie",其中一个 header,下一个 "voornaam"、"achternaam", "club"、"licentie" 也在 header 下,然后 "merk"、"type" 和 "nummerplaat" 也在下。
"header"我的意思是这样的;
您可以在下面找到 XAML 页面的代码;
<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>
您可以在 DataGrid 上方放置一个额外的 Grid 以获得额外的 headers 并绑定列宽:
<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>
当然,关于上下文菜单等,额外的 headers 不会算作 DataGrid 的一部分;如果需要,所有这些东西都必须手动添加。