【WPF】DataGrid多表头的样式设计

需求

在使用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 电子书


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/309066.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

异步清零和同步置数/清零的区别

同步&#xff0c;异步是对于时钟而言的。 同步指的是&#xff0c;状态的变化需要等待时钟有效沿来触发&#xff0c;所有动作同时跟随这个时钟变化&#xff0c;而异步时&#xff0c;状态变化不依赖与时钟。 异步清零说的是&#xff0c;你需要对一个计数器在满足某种条件时想要…

如何使用ABP进行软件开发之基础概览

ABP框架简述1&#xff09;简介在.NET众多的技术框架中&#xff0c;ABP框架&#xff08;本系列中指aspnetboilerplate项目&#xff09;以其独特的魅力吸引了一群优秀开发者广泛的使用。在该框架的赋能之下&#xff0c;开发者可根据需求通过官方网站【https://aspnetboilerplate.…

模2加法,模2减法,模2除法

十进制的除法&#xff0c;大家都会做&#xff1a;列个竖式&#xff0c;商&#xff0c;写在上面&#xff0c;上个几&#xff0c;再用被除数减去积&#xff0c;求得余数…。 二进制的除法&#xff0c;和十进制的计算方法相同&#xff0c;也要列出个竖式计算。 二进制的除法&…

《Unit Testing》2.1 伦敦学派如何做隔离

针对单元测试的定义&#xff0c;主要有两种看法&#xff1a;经典学派。经典学派之所以经典&#xff0c;是因为这原本就是人们做单元测试和测试驱动开发的方式伦敦学派。伦敦学派扎根于伦敦的编程社区。单元测试的定义单元测试有很多定义&#xff0c;但是所有的定义都有三个重要…

找出第i个小元素(算法导论第三版9.2-4题)

找出第i个小元素(算法导论第三版9.2-4题) 期望时间复杂度&#xff1a;Θ(n) 最坏情况的时间复杂度Θ(n^2) int randomized_select_based_loop(int *array,int start,int end,int index) {while (true){if(start end)return array[start];int middle randomized_partition(a…

C++实现数组模拟链表(实现链表的增删功能)

代码如下: #include <iostream> using namespace std; const int N 100;struct Node {int data;int next; };class ArrayList { private:Node node[N];int maxSize;//数组容量int idx;//接下来要插入的结点的下标int len;//链表长度public:void initList(){node[0].nex…

Gartner:容器采用将迅速增长,但不会很快有利可图

导语容器的未来可期&#xff0c;到2024年&#xff0c;所有应用程序中的15&#xff05;将在容器中运行&#xff0c;而这一数据今天仅为5&#xff05;&#xff0c;但当前变现还比较难。正文近日&#xff0c;Gartner公司发表其首次为软件容器管理软件和服务市场做的预测。Gartner说…

快速排序在最坏的情况下时间复杂度(Ω(nlgn)(算法导论第三版9.3-3))

快速排序在最坏的情况下时间复杂度Ω(nlgn) 1⃣️在元素各异时或者少量相等&#xff08;元素个数n>70) 时间复杂度Ω(nlgn) void quick_sort_by_median(int *array,int start,int end) {if(start<end){int median select(array,start,end,(end - start 1)/2 (end - …

线性表的定义与操作-顺序表,链式表(C语言)

顺序表: typedef int Position; typedef struct LNode *List; struct LNode {ElementType Data[MAXSIZE];Position Last; };/* 初始化 */ List MakeEmpty() {List L;L (List)malloc(sizeof(struct LNode));L->Last -1;return L; }/* 查找 */ #define ERROR -1Position Fi…

【Azure Show】|第三期 人工智能大咖与您分享!嘉宾陈海平胡浩陈堰平

欢迎来到Azure Show!Azure ShowHello,大家好&#xff0c;又来到新的一期的Azure Show!本期是人工智能专场&#xff0c;我们邀请到微软Data&AI的解决方案架构师陈堰平&#xff0c;Tensorflow.NET 作者陈海平&#xff0c;还有微软人工智能方向最有价值专家胡浩和大家分享人工…

确定S中最接近中位数的k个元素(算法导论第三版9.3-7)

确定S中最接近中位数的k个元素 &#xff08;算法导论第三版9.3-7题&#xff09; 时间复杂度O(n) vector<int> k_elements_closest_to_median(int *array,int start,int end,int k) {vector<int> result;int median select(array,start,end,(end - start 1)/2 …

深入探究ASP.NET Core异常处理中间件

前言全局异常处理是我们编程过程中不可或缺的重要环节。有了全局异常处理机制给我们带来了很多便捷&#xff0c;首先我们不用满屏幕处理程序可能出现的异常&#xff0c;其次我们可以对异常进行统一的处理&#xff0c;比如收集异常信息或者返回统一的格式等等。ASP.NET Core为我…

找出有序数组X和Y中所有元素的中位数(X,Y分别含n个元素)(算法导论第三版9.3-8)

找出有序数组X和Y中所有元素的中位数&#xff08;X&#xff0c;Y分别含n个元素&#xff09; &#xff08;算法导论第三版9.3-8&#xff09; 时间复杂度O&#xff08;lgn&#xff09; int find_median_two_ordered_arrays(int *array_a,int *array_b,int length) {int a_start…

有序序列中的i个最大数(算法导论思考题9-1)

有序序列中的i个最大数 &#xff08;算法导论思考题9-1&#xff09; a 时间复杂度O(nlgni) //总共时间复杂度O(nlgni) vector<int> i_largest_number_in_ordered_sequence_a(int *array,int length,int i){vector<int>result;//时间复杂度O(nlgn)quick_sort_by_m…

.NET Core加解密实战系列之——消息摘要与数字签名算法

简介加解密现状&#xff0c;编写此系列文章的背景&#xff1a;需要考虑系统环境兼容性问题&#xff08;Linux、Windows&#xff09;语言互通问题&#xff08;如C#、Java等&#xff09;&#xff08;加解密本质上没有语言之分&#xff0c;所以原则上不存在互通性问题&#xff09;…

堆栈的定义与操作-顺序存储,链式存储(C语言)

顺序存储&#xff1a; typedef int Position; struct SNode {ElementType *Data; /* 存储元素的数组 */Position Top; /* 栈顶指针 */int MaxSize; /* 堆栈最大容量 */ }; typedef struct SNode *Stack;Stack CreateStack( int MaxSize ) {Stack S (Stack)malloc(…

快速排序和选择模版类

快速排序和选择模版类 template<typename T> void insert_sort(T *array,int start,int end) {for (int i start 1; i < end 1; i) {int j i - 1 ;T key array[i];while (j > start && key < array[j]){array[j1] array[j];j--;}array[j1] key…

造轮子-AgileConfig一个基于.NetCore开发的轻量级配置中心

微服务确实是行业的一个趋势&#xff0c;我自己也在把一些项目往微服务架构迁移。玩微服务架构配置中心是一个绕不过去的东西&#xff0c;有很多大牌的组件可以选&#xff0c;比如spring-cloud-config&#xff0c;apoll&#xff0c;disconf等等。而我为什么还要造一个轮子呢&am…

队列的定义与操作-顺序存储,链式存储(C语言)

顺序存储&#xff1a; typedef int Position; struct QNode {ElementType *Data; /* 存储元素的数组 */Position Front, Rear; /* 队列的头、尾指针 */int MaxSize; /* 队列最大容量 */ }; typedef struct QNode *Queue;Queue CreateQueue( int MaxSize ) {Que…

带权中位数-算法导论第三版第九章思考题9-2

带权中位数-算法导论第三版第九章思考题9-2 b 时间复杂度O(nlgn) float find_median_with_weights_b(float *array,int length) {quick_sort<float>(array,0,length-1);float sum 0;int index 0;while (sum < 0.5){sum array[index];index;}return array[index-1…