You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF DataGrid自定义列布局:实现列堆叠是否可行?

WPF DataGrid 实现自定义列堆叠效果(仿Infragistics垂直列布局)

完全可以实现,不用依赖第三方控件,用WPF自带的DataGridTemplateColumn就能自定义列的表头和单元格内容,把多个字段垂直堆叠在同一列里。你写的代码已经找对了方向,下面是整理后的完整实现方案:

一、XAML布局实现

用DataGridTemplateColumn自定义堆叠列,表头用StackPanel做垂直分组,单元格里同样用StackPanel把多个字段垂直排列:

<Grid>
    <DataGrid x:Name="dataGrid" AutoGenerateColumns="False">
        <!-- 可选:统一列头样式 -->
        <DataGrid.Resources>
            <Style TargetType="DataGridColumnHeader">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="DataGridColumnHeader">
                            <Grid>
                                <TextBlock Text="{Binding}" FontWeight="Bold" />
                                <ContentPresenter />
                            </Grid>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </DataGrid.Resources>

        <DataGrid.Columns>
            <!-- 普通文本列 -->
            <DataGridTextColumn Header="ID" Binding="{Binding Id}" />

            <!-- 堆叠列:包含两个垂直排列的字段 -->
            <DataGridTemplateColumn>
                <DataGridTemplateColumn.Header>
                    <StackPanel>
                        <TextBlock Text="姓名组" FontWeight="Bold" />
                        <TextBlock Text="本名" />
                        <TextBlock Text="姓氏" />
                    </StackPanel>
                </DataGridTemplateColumn.Header>
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <StackPanel Margin="4,2">
                            <TextBlock Text="{Binding PrimaryName}" />
                            <TextBlock Text="{Binding SecondaryName}" />
                        </StackPanel>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>

            <!-- 普通文本列 -->
            <DataGridTextColumn Header="年龄" Binding="{Binding Age}" />
        </DataGrid.Columns>
    </DataGrid>
</Grid>

二、后台代码与数据实体

数据实体类

public class MyData
{
    public int Id { get; set; }
    public string PrimaryName { get; set; }
    public string SecondaryName { get; set; }
    public int Age { get; set; }
}

窗口后台绑定数据

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        LoadDataGrid();
    }

    private void LoadDataGrid()
    {
        var data = new List<MyData>
        {
            new MyData { Id = 1, PrimaryName = "约翰", SecondaryName = "多伊", Age = 25 },
            new MyData { Id = 2, PrimaryName = "简", SecondaryName = "多伊", Age = 30 },
            new MyData { Id = 3, PrimaryName = "萨姆", SecondaryName = "史密斯", Age = 35 }
        };
        dataGrid.ItemsSource = data;
    }
}

核心要点

  • 表头的垂直分组:通过DataGridTemplateColumn.Header里的StackPanel实现多行表头文字的垂直排列。
  • 单元格的垂直堆叠:在CellTemplate的DataTemplate中用StackPanel把多个绑定字段上下排列,实现一列容纳多段内容的效果。
  • 可扩展:如果需要加分隔线、调整对齐方式或者更复杂的样式,直接在StackPanel里加元素或修改属性就行。

内容的提问来源于stack exchange,提问作者NicLight93

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 01:31:02