需求

在使用WPF开发时,使用DataGrid列表显示数据时,有些字段可以进行分组显示,用于更好的表达它们之间存在的某种关系,因此就考虑到要对DataGrid的表头进行扩展,可以显示多行表头,让这些有关联的字段内容显示的更加明了简洁。

image

自定义样式

这段自定义样式可以放在MainWindow.xaml文件中,或者自己定义一个存放样式文件的xaml进行存放。这里在模版里面使用的第一个Grid,是用于总的显示,还有右侧边竖线分割线,嵌入的Grid用于显示多表头的处理显示功能:第一行为总的信息,第二行为第一行和第三行的分割线,第三行显示的省、市和县。

<Style x:Key="CityStyle" TargetType="DataGridColumnHeader"><Setter Property="Template"><Setter.Value><ControlTemplate><Grid x:Name="Root"><Grid.ColumnDefinitions><ColumnDefinition></ColumnDefinition><ColumnDefinition Width="Auto"></ColumnDefinition></Grid.ColumnDefinitions><GridGrid.Column="0"HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"VerticalAlignment="{TemplateBinding VerticalContentAlignment}"><Grid.RowDefinitions><RowDefinition Height="30"></RowDefinition><RowDefinition Height="Auto"></RowDefinition><RowDefinition Height="30"></RowDefinition></Grid.RowDefinitions><Grid.ColumnDefinitions><ColumnDefinition Width="100"></ColumnDefinition><ColumnDefinition Width="Auto"></ColumnDefinition><ColumnDefinition Width="100"></ColumnDefinition><ColumnDefinition Width="Auto"></ColumnDefinition><ColumnDefinition Width="100"></ColumnDefinition></Grid.ColumnDefinitions><ContentPresenterGrid.Row="0"Grid.Column="0"Grid.ColumnSpan="5"HorizontalAlignment="Center"VerticalAlignment="Center"Content="户籍信息"></ContentPresenter><RectangleGrid.Row="1"Grid.Column="0"Grid.ColumnSpan="5"VerticalAlignment="Stretch" Height="1"Fill="Black"Visibility="Visible"></Rectangle><ContentPresenterGrid.Row="2"Grid.Column="0"HorizontalAlignment="Center"VerticalAlignment="Center"Content="省"></ContentPresenter><RectangleGrid.Row="2"Grid.Column="1"Width="1"VerticalAlignment="Stretch"Fill="#ccc"Visibility="Visible"></Rectangle><ContentPresenterGrid.Row="2"Grid.Column="2"HorizontalAlignment="Center"VerticalAlignment="Center"Content="市"></ContentPresenter><RectangleGrid.Row="2"Grid.Column="3"Width="1"VerticalAlignment="Stretch"Fill="#ccc"Visibility="Visible"></Rectangle><ContentPresenterGrid.Row="2"Grid.Column="4"HorizontalAlignment="Center"VerticalAlignment="Center"Content="县"></ContentPresenter></Grid><RectangleGrid.Column="1"Width="1"VerticalAlignment="Stretch"Fill="#ccc"Visibility="Visible"></Rectangle></Grid></ControlTemplate></Setter.Value></Setter>
</Style>

窗体布局

<Grid><DataGridAutoGenerateColumns="False"CanUserAddRows="False"ItemsSource="{Binding UserInformations}"><DataGrid.Columns><DataGridTextColumn Width="100" Binding="{Binding UserName}"><DataGridTextColumn.HeaderTemplate><DataTemplate><Grid HorizontalAlignment="Stretch" VerticalAlignment="Center"><TextBlockMargin="5,0,5,0"HorizontalAlignment="Center"VerticalAlignment="Center"Text="姓名"TextAlignment="Center"TextWrapping="Wrap"></TextBlock></Grid></DataTemplate></DataGridTextColumn.HeaderTemplate><DataGridTextColumn.ElementStyle><Style><Setter Property="TextBlock.TextAlignment" Value="Center"></Setter><Setter Property="TextBlock.TextWrapping" Value="Wrap"></Setter><Setter Property="TextBlock.HorizontalAlignment" Value="Center"></Setter><Setter Property="TextBlock.VerticalAlignment" Value="Center"></Setter></Style></DataGridTextColumn.ElementStyle></DataGridTextColumn><DataGridTemplateColumn HeaderStyle="{StaticResource CityStyle}"><DataGridTemplateColumn.CellTemplate><DataTemplate><StackPanel Orientation="Horizontal"><TextBlockWidth="100"Margin="0"HorizontalAlignment="Center"VerticalAlignment="Center"Text="{Binding Province}"TextAlignment="Center"></TextBlock><Rectangle Width="1" Fill="Black"></Rectangle><TextBlockWidth="100"HorizontalAlignment="Center"VerticalAlignment="Center"Text="{Binding City}"TextAlignment="Center"></TextBlock><Rectangle Width="1" Fill="Black"></Rectangle><TextBlockWidth="100"HorizontalAlignment="Center"VerticalAlignment="Center"Text="{Binding County}"TextAlignment="Center"></TextBlock></StackPanel></DataTemplate></DataGridTemplateColumn.CellTemplate></DataGridTemplateColumn><DataGridTextColumnWidth="100"Binding="{Binding Motto}"Header="格言"><DataGridTextColumn.HeaderStyle><Style><Setter Property="TextBlock.HorizontalAlignment" Value="Stretch"></Setter><Setter Property="TextBlock.TextAlignment" Value="Center"></Setter></Style></DataGridTextColumn.HeaderStyle><DataGridTextColumn.HeaderTemplate><DataTemplate><TextBlockHorizontalAlignment="Center"VerticalAlignment="Center"Text="格言"TextAlignment="Center"TextWrapping="Wrap"></TextBlock></DataTemplate></DataGridTextColumn.HeaderTemplate><DataGridTextColumn.ElementStyle><Style><Setter Property="TextBlock.TextAlignment" Value="Center"></Setter><Setter Property="TextBlock.TextWrapping" Value="Wrap"></Setter><Setter Property="TextBlock.HorizontalAlignment" Value="Center"></Setter><Setter Property="TextBlock.VerticalAlignment" Value="Center"></Setter></Style></DataGridTextColumn.ElementStyle></DataGridTextColumn></DataGrid.Columns></DataGrid>
</Grid>

在这里的窗体布局中,同时对姓名和格言的表头样式和Cell里面的样式进行了修改。其中DataGridTextColumn.HeaderTemplate包括的是头部的样式;DataGridTextColumn.ElementStyle包括的是Cell的样式。

定义的实体类

public class UserInformation{public string UserName { get; set; }public string Province { get; set; }public string City { get; set; }public string County { get; set; }public int Age { get; set; }public string Motto { get; set; }}

ViewModel类的定义

public class MainViewModel:ViewModelBase{private string _title;public string Title{get { return _title; }set { Set(ref _title, value); }}private ObservableCollection<UserInformation> _userInformations;public ObservableCollection<UserInformation> UserInformations{get { return _userInformations; }set { Set(ref _userInformations, value); }}public MainViewModel(){Title = Guid.NewGuid().ToString();UserInformations = new ObservableCollection<UserInformation>(new List<UserInformation>(){new UserInformation(){UserName = "Bob",Age = 32,Province = "山东",City = "济南",County = "天桥",Motto = "会当云绝顶,\r\n一览众山小。"},new UserInformation(){UserName = "Bob",Age = 32,Province = "山东",City = "济南",County = "天桥",Motto = "会当云绝顶,\r\n一览众山小。"},new UserInformation(){UserName = "Bob",Age = 32,Province = "山东",City = "济南",County = "天桥",Motto = "会当云绝顶,\r\n一览众山小。"}});}}

本实例使用了.netcore 3.1版本进行的开发,但是对于.net framework同样适用。

MVVM模式是使用MVVMLightstd10,可以从nuget上面进行下载。

本示例已上传至GITHUB:https://github.com/mzy666888/MultiHeaderOfDataGridWpfApp

— END —

「扩展阅读」

[GitHub] 75+的 C# 数据结构和算法实现

谁说.NET不适合搞BD,ML、AI

推荐一个集录屏、截图、音频于一体的软件给大家

10个用于C#.NET开发的基本调试工具

Xamarin.Forms 二维码扫描实践

在Asp.Net Core MVC 开发过程中遇到的问题总结

前端小白在asp.net core mvc中使用ECharts

基于Asp.Net Core MVC和AdminLTE的响应式管理后台之侧边栏处理

[译]如何在C#中调试LINQ查询

C# 语言性能提升方法

使用MQTTnet搭建Mqtt服务器

OxyPlot在WinForm中的应用

「公众号推荐」

回复:「redis」 获取5.0.9版的Windows安装包(exe)

回复:「ca」 获取  截图、GIF等工具三件套,便携版和安装版全部包括

回复:「新书」 获取《ASP.NET Core 3框架揭秘》

回复:「进阶」 获取 《CLR via C#(第4版)》购书链接

回复:「本质论」获取 《C# 7.0本质论》购书链接

回复:「WPF」获取 WPF 电子书


【WPF】DataGrid多表头的样式设计相关推荐

  1. WPF Datagrid合并表头的思路

    在使用datagrid的时候,有很多情况下,都需要合并表头,多行表头之类的操作.这就需要我们自定义列了. 本文给出一个思路,可以实现此需要,只是本人对这个研究不很明白,只是只是实现,仅此而已. 下面是 ...

  2. C# WPF DataGrid控件的详细介绍和推荐一些样式设计

    前面介绍过使用DataGrid简单绑定一个数据模型,接着介绍DataGrid的一些详细操作. 参考:C# WPF DataGrid的使用 定制DataGrid控件基本外观属性 RowBackgroun ...

  3. WPF DataGrid 通过自定义表头模拟首行固定

    WPF DataGrid 通过自定义表头模拟首行固定 独立观察员 2021 年 9 月 25 日 最近工作中要在 WPF 中做个表格,自然首选就是 DataGrid 控件了.问题是,UI 设计的表格是 ...

  4. DataGrid多层表头设计

    DataGrid多层表头设计 作者:未知 来源:月光软件站 加入时间:2005-6-5 月光软件站 最近做的项目用到了DataGrid多层表头,问了很多人,自己感觉回答不是很明确,自己总结了一下,希望 ...

  5. WPF DataGrid 表头筛选

    我用DataGridExtensions 拓展包后,发现他筛选是进行内容变更后就直接筛选,这样会吃掉大量的内存,我想看看其他的方法或者它写有进行键盘回车再进行筛选,发现没找到(如果大佬了解的话,麻烦教 ...

  6. WPF DataGrid自定义样式模板 列表头分隔线 滚动条滑块大小设定 动态数据绑定和更新

    [ 效果图回去放,代码在后面 ] [ 用到的一些定义如果没有附代码可以随便写个看下效果,因为直接从项目中copy出来的,难免漏掉点点... ] 首先,有几点需要注意: 1.表头样式 [ DataGri ...

  7. WPF DataGrid控件样式

    WPF DataGrid控件样式 <DataGrid ItemsSource="{Binding ProductsList}" AutoGenerateColumns=&qu ...

  8. WPF DataGrid 如何将被选中行带到视野中

    WPF DataGrid 如何将被选中行带到视野中 目录 前言 准备工作 方法一 方法二 总结 独立观察员 2021 年 12 月 11 日 前言 在 WPF 开发中,显示表格一般使用 DataGri ...

  9. WPF Calendar 日历控件 样式自定义

    原文:WPF Calendar 日历控件 样式自定义 粗略的在代码上做了些注释 blend 生成出来的模版 有的时候 会生成 跟 vs ui界面不兼容的代码 会导致可视化设计界面 报错崩溃掉 但是确不 ...

最新文章

  1. 【xml】python的lxml库使用
  2. 一个简单的Java计时器项目,附源码
  3. while、do while练习——7月24日
  4. 大白话5分钟带你走进人工智能-第31节集成学习之最通俗理解GBDT原理和过程
  5. GitOps:Weaveworks通过开发者工具实现CI/CD
  6. hnu 暑期实训之魔咒词典
  7. python软件下载3版本-Python 3.7.2和3.6.8版本发布下载,附更新说明
  8. BCD码干什么用的?
  9. 理解并取证:IPv6与IPv4在报文结构上的区别
  10. groupadd命令详解(实例)
  11. 光储直流微电网simulink仿真模型 双向变换器 ,独立光伏系统能量管理,最大功率点跟踪mppt
  12. 软件测试简历项目经验该怎么写?【两年经验】
  13. 房屋租赁合同模板2020 免费下载
  14. Ubuntu虚拟机使用桥接模式设置IP
  15. 线粒体靶向的纳米递送PCN-224 纳米粒子-瑞禧
  16. 高德地图地址解析经纬度以及经纬度解析地址
  17. Codefroces 760 B. Frodo and pillows
  18. golang操作chromedp模拟浏览器基础入门
  19. 【论文翻译|2021】A survey on heterogeneous network representation learning 异构网络表示学习综述
  20. 大星星学物联网概览篇-硬件

热门文章

  1. JAVA基础知识之网络编程——-基于AIO的异步Socket通信
  2. 2016福州大学软件工程第四次团队作业-系统设计成绩汇总
  3. UILabel的高度自适应
  4. 【转】jQuery中的bind(),live(),delegate(),on()事件绑定方式的区别
  5. 参数化的RBAC模型
  6. 物体成瘾性_科技成瘾使我们不那么快乐。 那是一个市场机会。
  7. 全量更新和增量更新_增量BIOS更新或直接更新到最新版本哪个更好?
  8. 原生js打印指定节点元素
  9. 如何解决90%的报表设计难题?300张报表模板任君挑选
  10. 读名老中医之路笔记(二)