WPF Datagrid合并表头的思路

在使用datagrid的时候,有很多情况下,都需要合并表头,多行表头之类的操作。这就需要我们自定义列了。

本文给出一个思路,可以实现此需要,只是本人对这个研究不很明白,只是只是实现,仅此而已。

下面是效果图:

下面就看看代码:

直接在MainWindow实现:

<Window x:Class="wpfcore.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:wpfcore" 
        xmlns:controls="http://metro.mahapps.com/winfx/xaml/controls"
        mc:Ignorable="d"
        Background="LightBlue"
        UseLayoutRounding="True"
        Title="MainWindow" Width="600" Height="340">
    <Grid>
        <DataGrid ItemsSource="{Binding Students}" AutoGenerateColumns="False" 
                  GridLinesVisibility="All" FontSize="18"
                  HorizontalGridLinesBrush="Red" VerticalGridLinesBrush="Red" 
                  ColumnHeaderHeight="60">
            <DataGrid.Columns>
                <DataGridTemplateColumn Width="150">
                    <DataGridTemplateColumn.HeaderStyle>
                        <Style TargetType="DataGridColumnHeader">
                            <Setter Property="HorizontalContentAlignment" Value="Center"/>
                            <Setter Property="Height" Value="60"/>
                            <Setter Property="Template">
                                <Setter.Value>
                                    <ControlTemplate TargetType="DataGridColumnHeader">
                                        <Border Grid.Column="0" Grid.Row="1" BorderBrush="Red" BorderThickness="1">
                                            <TextBlock Text="姓名" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                                        </Border>
                                    </ControlTemplate>
                                </Setter.Value>
                            </Setter>
</Style>
                    </DataGridTemplateColumn.HeaderStyle>
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Grid.Column="0" Text="{Binding Name}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
                <DataGridTemplateColumn Width="150">
                    <DataGridTemplateColumn.HeaderStyle>
                        <Style TargetType="DataGridColumnHeader">
                            <Setter Property="HorizontalContentAlignment" Value="Center"/>
                            <Setter Property="Height" Value="60"/>
                            <Setter Property="Template">
                                <Setter.Value>
                                    <ControlTemplate TargetType="DataGridColumnHeader">
                                        <Border Grid.Column="0" Grid.Row="1" BorderBrush="Red" BorderThickness="0 1 1 1">
                                            <TextBlock Text="年龄" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                                        </Border>
                                    </ControlTemplate>
                                </Setter.Value>
                            </Setter>
</Style>
                    </DataGridTemplateColumn.HeaderStyle>
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Grid.Column="0" Text="{Binding Age}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
                <DataGridTemplateColumn x:Name="baseInfoColumn" Width="150">
                    <DataGridTemplateColumn.HeaderStyle>
                        <Style TargetType="DataGridColumnHeader">
                            <Setter Property="HorizontalContentAlignment" Value="Center"/>
                            <Setter Property="Height" Value="60"/>
                            <Setter Property="VerticalAlignment" Value="Top"/>
                            <Setter Property="Template">
                                <Setter.Value>
                                    <ControlTemplate TargetType="DataGridColumnHeader">
                                        <Grid>
                                            <Grid.ColumnDefinitions>
                                                <ColumnDefinition/>
                                                <ColumnDefinition/>
                                                <ColumnDefinition/>
                                            </Grid.ColumnDefinitions>
                                            <Grid.RowDefinitions>
                                                <RowDefinition/>
                                                <RowDefinition/>
                                            </Grid.RowDefinitions> 
                                            <Border  Grid.Column="0" Grid.ColumnSpan="3" BorderBrush="Red" BorderThickness="0 1 1 0">
                                                <TextBlock
                                                       HorizontalAlignment="Center" VerticalAlignment="Center"
                                                       Text="基本信息"/>
                                            </Border>
                                            <Border Grid.Column="0" Grid.Row="1" BorderBrush="Red" BorderThickness="0 1 1 1">
                                                <TextBlock Text="身高" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                                            </Border>
                                            <Border Grid.Column="1" Grid.Row="1" BorderBrush="Red" BorderThickness="0 1 1 1">
                                                <TextBlock Text="体重" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                                            </Border>
                                            <Border Grid.Column="2" Grid.Row="1" BorderBrush="Red" BorderThickness="0 1 1 1">
                                                <TextBlock Text="性别" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                                            </Border>
                                        </Grid>
                                    </ControlTemplate>
                                </Setter.Value>
                            </Setter>
</Style>
                    </DataGridTemplateColumn.HeaderStyle>
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <Grid>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition/>
                                    <ColumnDefinition/>
                                    <ColumnDefinition/>
                                </Grid.ColumnDefinitions>
                                <TextBlock Grid.Column="0" Text="{Binding Stature}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                                <TextBlock Grid.Column="1" Text="{Binding Weight}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                                <TextBlock Grid.Column="2" Text="{Binding Gender}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                            </Grid>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
                <DataGridTemplateColumn Width="150">
                    <DataGridTemplateColumn.HeaderStyle>
                        <Style TargetType="DataGridColumnHeader">
                            <Setter Property="HorizontalContentAlignment" Value="Center"/>
                            <Setter Property="Height" Value="60"/>
                            <Setter Property="Template">
                                <Setter.Value>
                                    <ControlTemplate TargetType="DataGridColumnHeader">
                                        <Border Grid.Column="0" Grid.Row="1" BorderBrush="Red" BorderThickness="0 1 1 1">
                                            <TextBlock Text="年龄" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                                        </Border>
                                    </ControlTemplate>
                                </Setter.Value>
                            </Setter>
</Style>
                    </DataGridTemplateColumn.HeaderStyle>
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Grid.Column="0" Text="{Binding Age}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>


MainWindow.cs,定义了三行数据的VM:

using System;
using System.Collections.ObjectModel;
using System.Windows;
using System.Windows.Input;


namespace wpfcore
{
    public partial class MainWindow : Window
    {
        public ObservableCollection<Student> Students { get; set; } = new ObservableCollection<Student>();
        public MainWindow()
        {
            InitializeComponent();
            Students.Add(new Student()
            {
                Name="张三",
                Age=18,
                Stature=188,
                Weight=95,
                Gender="男"
            });
            Students.Add(new Student()
            {
                Name = "李四",
                Age = 18,
                Stature = 188,
                Weight = 95,
                Gender = "男"
            });
            Students.Add(new Student()
            {
                Name = "小红",
                Age = 18,
                Stature = 188,
                Weight = 95,
                Gender = "男"
            });
            DataContext = this;
        }   
    }


    public class Student
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public int Stature { get; set; }
        public int Weight { get; set; }
        public string Gender { get; set; }
    }
}


OK,全部代码就是这样,思路就是使用DataGridTemplateColumn,需要合并的时候,就定义一个,然后在每个列再分出多列,绑定的数据还是原来的row的数据。这样就能拐着弯实现合并表头了。。。

如果喜欢,点个赞呗~

### 回答1: WPF DataGrid复合表头用于在表格中显示多级标题。在DataGrid中,复合表头可以以层次结构的方式组织和显示列标题,使用户更好地理解和管理表格数据。 要创建复合表头,我们可以使用DataGridTemplateColumn和HeaderTemplate属性。首先,我们需要定义一个复合表头模板,其中包含多个层次结构的标题。可以使用StackPanel或Grid等容器控件来组织这些层次结构。 下面是一个示例,展示了如何创建一个具有两个层次结构的复合表头: ```xaml <DataGrid> <DataGrid.Columns> <DataGridTemplateColumn> <DataGridTemplateColumn.HeaderTemplate> <DataTemplate> <Grid> <Grid.RowDefinitions> <RowDefinition /> <RowDefinition /> </Grid.RowDefinitions> <TextBlock Grid.Row="0" Text="第一级标题" /> <TextBlock Grid.Row="1" Text="第二级标题" /> </Grid> </DataTemplate> </DataGridTemplateColumn.HeaderTemplate> </DataGridTemplateColumn> </DataGrid.Columns> </DataGrid> ``` 上述示例中,我们创建了一个DataGridTemplateColumn,并将其HeaderTemplate属性设置为一个包含两个TextBlock的Grid。这样,第一级标题和第二级标题就以层次结构的方式显示在表头中。 通过使用嵌套的容器控件和定义适当的布局,我们可以创建更复杂的多级标题结构。在实际使用中,我们可以根据需求进行自定义和扩展,以满足复杂表格的显示需求。 总的来说,WPF DataGrid复合表头提供了一种更灵活和直观的方式来管理和展示表格数据,使用户能够更好地理解和操作数据。 ### 回答2: WPF DataGrid是一个强大的控件,允许我们通过使用复合表头来组织和显示数据。复合表头是指一个表头下面有多个子表头的情况。 要在WPF DataGrid中使用复合表头,我们需要使用DataGrid的ColumnHeaderStyle属性来自定义表头的样式。我们可以使用StackPanel控件来嵌套多个表头,并设置每个表头的样式和内容。 首先,我们需要创建一个StackPanel来作为根表头。然后,我们可以使用TextBlock或其他控件来添加子表头,并设置它们的样式和内容。我们可以使用Margin属性来设置每个子表头之间的间距。 接下来,我们需要将StackPanel添加到DataGrid的ColumnHeaderStyle属性中。这样,每个列的表头都会根据这个样式进行显示。 如果我们想要在复合表头中显示具有层次结构的数据,可以使用HierarchicalDataTemplate来定义每个子表头的内容。HierarchicalDataTemplate允许我们绑定嵌套的数据,并在子表头中显示它们。 最后,我们可以根据需要自定义表头的外观,比如设置颜色、字体等属性。我们可以使用Setter和Trigger来实现这些自定义样式。 总之,WPF DataGrid允许我们通过使用复合表头来组织和显示数据。我们可以使用StackPanel来创建复合表头,并使用ColumnHeaderStyle属性和HierarchicalDataTemplate来自定义表头的样式和内容。通过这种方式,我们可以创建出功能强大且易于使用的数据表格。 ### 回答3: WPF DataGrid是一种用于呈现和编辑数据的控件,它支持复合表头。复合表头是指表格中的表头可以跨越多列或多行,提供更灵活和复杂的布局。 要实现复合表头,我们可以使用DataGrid的列合并功能。首先,在DataGrid的XAML代码中,我们可以定义多个DataGridTextColumn或其他类型的列,并为每个列设置相应的属性和样式。然后,我们可以在需要合并的列中使用DataGrid.ColumnHeaderStyle属性来设置合并样式。 可以通过设置DataGrid.ColumnHeaderStyle中的ContentTemplate属性来定义自定义表头。在ContentTemplate中,我们可以使用Grid来创建一个包含多个单元格的布局。通过设置Grid的列或行的宽度和高度,我们可以控制表头中每个单元格的大小和位置。还可以在每个单元格中添加文本或其他控件来自定义表头的内容。 除了定义自定义表头的布局,我们还可以使用DataGrid.ColumnHeaderStyle中的其他属性来设置表头的外观,如前景色、背景色、字体样式等。这样,我们就能够创建出符合我们需求的复合表头了。 在绑定数据时,我们只需要将数据源的属性与对应的表格列进行绑定,DataGrid会自动将数据显示在表格中。由于复合表头的实现是基于DataGrid的列合并功能,因此绑定数据时并不需要额外的操作。 通过实现复合表头,我们可以打造出专业而美观的数据展示界面,提高用户的数据浏览和编辑体验。同时,WPF DataGrid的强大功能和灵活性也使得复合表头的实现变得简单而有效。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值