WPF 中 DataGrid 的多级列标题
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/17652039/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Multilevel column header for DataGrid in WPF
提问by Vivek Saurav
I have a DataGridwhich needs to look like this:
我有一个DataGrid需要看起来像这样:


As you can see, there are multiple columns as well as multi-level column headers, some that span multiple columns.
如您所见,有多个列以及多级列标题,其中一些跨越多个列。
I need to do this in WPF, so kindly provide only XAML solutions which will create multi level column headers.
我需要在 WPF 中执行此操作,因此请仅提供将创建多级列标题的 XAML 解决方案。
采纳答案by Anatoliy Nikolaev
As far as I know, the standard DataGriddoes not support it, so you need to look for alternatives. I can offer the use of a Gridcapabilities, such as: Grid.RowDefinitions, Grid.ColumnDefinitions. To illustrate this feature, I created a sample, who need to complete:
据我所知,标准DataGrid不支持它,所以你需要寻找替代品。我可以提供使用Grid功能,例如:Grid.RowDefinitions,Grid.ColumnDefinitions。为了说明这个特性,我创建了一个示例,需要完成:
<Window x:Class="MultiHeaderDataGrid.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525"
WindowStartupLocation="CenterScreen">
<Window.Resources>
<Style TargetType="{x:Type Border}">
<Setter Property="Background" Value="Bisque" />
<Setter Property="TextBlock.FontSize" Value="14" />
<Setter Property="BorderBrush" Value="Black" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="HorizontalAlignment" Value="Stretch" />
</Style>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="2*"/>
</Grid.RowDefinitions>
<Grid Grid.Row="0">
<Border Grid.Column="1" Grid.ColumnSpan="4">
<TextBlock Text="Main application" TextAlignment="Center" />
</Border>
</Grid>
<Grid Grid.Row="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Border Grid.Column="0">
<TextBlock Grid.Column="1" Text="Experiment 1" TextAlignment="Center" />
</Border>
<Border Grid.Column="1">
<TextBlock Grid.Column="1" Text="Experiment 2" TextAlignment="Center" />
</Border>
</Grid>
<Grid Grid.Row="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Border Grid.Column="0">
<TextBlock Grid.Column="1" Text="Mode 1" TextAlignment="Center" />
</Border>
<Border Grid.Column="1">
<TextBlock Grid.Column="1" Text="Mode 2" TextAlignment="Center" />
</Border>
<Border Grid.Column="2">
<TextBlock Grid.Column="1" Text="Mode 1" TextAlignment="Center" />
</Border>
<Border Grid.Column="4">
<TextBlock Grid.Column="1" Text="Mode 2" TextAlignment="Center" />
</Border>
</Grid>
<Grid Grid.Row="3">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Border Grid.Column="0">
<TextBlock Grid.Column="1" Text="Mode 1" TextAlignment="Center" />
</Border>
<Border Grid.Column="1">
<TextBlock Grid.Column="1" Text="Mode 2" TextAlignment="Center" />
</Border>
<Border Grid.Column="2">
<TextBlock Grid.Column="1" Text="Mode 1" TextAlignment="Center" />
</Border>
<Border Grid.Column="4">
<TextBlock Grid.Column="1" Text="Mode 2" TextAlignment="Center" />
</Border>
</Grid>
<DataGrid Name="datagrid1" AutoGenerateColumns="False" Grid.Row="3" RowHeaderWidth="10" Loaded="datagrid1_Loaded">
<DataGrid.Columns>
<DataGridTextColumn x:Name="Column1" Binding="{Binding Name}" Header="column 1" Width="100" />
<DataGridTextColumn x:Name="Column2" Binding="{Binding Age}" Header="column 2" Width="80" />
<DataGridTextColumn x:Name="Column3" Binding="{Binding Sample}" Header="column 3" Width="80" />
<DataGridTextColumn x:Name="Column4" Binding="{Binding Sample}" Header="column 4" Width="*" />
</DataGrid.Columns>
</DataGrid>
</Grid>
</Window>
Output
Output


If you want, you can set the ColumnDefinition Widthof a Grid, like a DataGridcolumn:
如果你愿意,你可以设置ColumnDefinition Widtha Grid,就像一DataGrid列:
<Grid.ColumnDefinitions>
<ColumnDefinition Width="{Binding ElementName=SampleDataGrid, Path=RowHeaderWidth}" />
<ColumnDefinition Width="{Binding ElementName=Column1, Path=ActualWidth}" />
<ColumnDefinition Width="{Binding ElementName=Column2, Path=ActualWidth}" />
</Grid.ColumnDefinitions>
Also, you need to define the same Stylefor the Gridheader and DataGrid.
此外,您需要Style为Grid标题和DataGrid.
回答by Edwin Lopez
<DataGrid>
<DataGrid.Columns>
<DataGridTemplateColumn Width="400">
<DataGridTemplateColumn.Header>
<StackPanel Width="400" HorizontalAlignment="Center">
<Label HorizontalContentAlignment="Center" FontWeight="Bold">EXPERIMENT 1</Label>
<Line Stroke="Black"
X1="0"
X2="400"
Y1="0"
Y2="0" />
<StackPanel Width="400" Orientation="Horizontal">
<Label Width="200" HorizontalContentAlignment="Center">MODE 1</Label>
<Line Stroke="Black"
X1="1"
X2="1"
Y1="0"
Y2="26" />
<Label Width="200" HorizontalContentAlignment="Center">MODE 2</Label>
</StackPanel>
<Line Stroke="Black"
X1="0"
X2="400"
Y1="0"
Y2="0" />
<StackPanel Width="400" Orientation="Horizontal">
<Label Width="100" HorizontalContentAlignment="Center">VALUE 1</Label>
<Line Stroke="Black"
X1="1"
X2="1"
Y1="0"
Y2="26" />
<Label Width="100" HorizontalContentAlignment="Center">VALUE 2</Label>
<Line Stroke="Black"
X1="1"
X2="1"
Y1="0"
Y2="26" />
<Label Width="100" HorizontalContentAlignment="Center">VALUE 1</Label>
<Line Stroke="Black"
X1="1"
X2="1"
Y1="0"
Y2="26" />
<Label Width="100" HorizontalContentAlignment="Center">VALUE 2</Label>
</StackPanel>
</StackPanel>
</DataGridTemplateColumn.Header>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Width="400" Orientation="Horizontal">
<ComboBox Width="100" />
<ComboBox Width="100" />
<ComboBox Width="100" />
<ComboBox Width="100" />
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Width="400">
<DataGridTemplateColumn.Header>
<StackPanel Width="400" HorizontalAlignment="Center">
<Label HorizontalContentAlignment="Center" FontWeight="Bold">EXPERIMENT 2</Label>
<Line Stroke="Black"
X1="0"
X2="400"
Y1="0"
Y2="0" />
<StackPanel Width="400" Orientation="Horizontal">
<Label Width="200" HorizontalContentAlignment="Center">MODE 1</Label>
<Line Stroke="Black"
X1="1"
X2="1"
Y1="0"
Y2="26" />
<Label Width="200" HorizontalContentAlignment="Center">MODE 2</Label>
</StackPanel>
<Line Stroke="Black"
X1="0"
X2="400"
Y1="0"
Y2="0" />
<StackPanel Width="400" Orientation="Horizontal">
<Label Width="100" HorizontalContentAlignment="Center">VALUE 1</Label>
<Line Stroke="Black"
X1="1"
X2="1"
Y1="0"
Y2="26" />
<Label Width="100" HorizontalContentAlignment="Center">VALUE 2</Label>
<Line Stroke="Black"
X1="1"
X2="1"
Y1="0"
Y2="26" />
<Label Width="100" HorizontalContentAlignment="Center">VALUE 1</Label>
<Line Stroke="Black"
X1="1"
X2="1"
Y1="0"
Y2="26" />
<Label Width="100" HorizontalContentAlignment="Center">VALUE 2</Label>
</StackPanel>
</StackPanel>
</DataGridTemplateColumn.Header>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Width="400" Orientation="Horizontal">
<ComboBox Width="100" />
<ComboBox Width="100" />
<ComboBox Width="100" />
<ComboBox Width="100" />
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>

