【WPF】DataGrid多表头的样式设计
需求
在使用WPF开发时,使用DataGrid
列表显示数据时,有些字段可以进行分组显示,用于更好的表达它们之间存在的某种关系,因此就考虑到要对DataGrid
的表头进行扩展,可以显示多行表头,让这些有关联的字段内容显示的更加明了简洁。
自定义样式
这段自定义样式可以放在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上面进行下载。
— 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多表头的样式设计相关推荐
- WPF Datagrid合并表头的思路
在使用datagrid的时候,有很多情况下,都需要合并表头,多行表头之类的操作.这就需要我们自定义列了. 本文给出一个思路,可以实现此需要,只是本人对这个研究不很明白,只是只是实现,仅此而已. 下面是 ...
- C# WPF DataGrid控件的详细介绍和推荐一些样式设计
前面介绍过使用DataGrid简单绑定一个数据模型,接着介绍DataGrid的一些详细操作. 参考:C# WPF DataGrid的使用 定制DataGrid控件基本外观属性 RowBackgroun ...
- WPF DataGrid 通过自定义表头模拟首行固定
WPF DataGrid 通过自定义表头模拟首行固定 独立观察员 2021 年 9 月 25 日 最近工作中要在 WPF 中做个表格,自然首选就是 DataGrid 控件了.问题是,UI 设计的表格是 ...
- DataGrid多层表头设计
DataGrid多层表头设计 作者:未知 来源:月光软件站 加入时间:2005-6-5 月光软件站 最近做的项目用到了DataGrid多层表头,问了很多人,自己感觉回答不是很明确,自己总结了一下,希望 ...
- WPF DataGrid 表头筛选
我用DataGridExtensions 拓展包后,发现他筛选是进行内容变更后就直接筛选,这样会吃掉大量的内存,我想看看其他的方法或者它写有进行键盘回车再进行筛选,发现没找到(如果大佬了解的话,麻烦教 ...
- WPF DataGrid自定义样式模板 列表头分隔线 滚动条滑块大小设定 动态数据绑定和更新
[ 效果图回去放,代码在后面 ] [ 用到的一些定义如果没有附代码可以随便写个看下效果,因为直接从项目中copy出来的,难免漏掉点点... ] 首先,有几点需要注意: 1.表头样式 [ DataGri ...
- WPF DataGrid控件样式
WPF DataGrid控件样式 <DataGrid ItemsSource="{Binding ProductsList}" AutoGenerateColumns=&qu ...
- WPF DataGrid 如何将被选中行带到视野中
WPF DataGrid 如何将被选中行带到视野中 目录 前言 准备工作 方法一 方法二 总结 独立观察员 2021 年 12 月 11 日 前言 在 WPF 开发中,显示表格一般使用 DataGri ...
- WPF Calendar 日历控件 样式自定义
原文:WPF Calendar 日历控件 样式自定义 粗略的在代码上做了些注释 blend 生成出来的模版 有的时候 会生成 跟 vs ui界面不兼容的代码 会导致可视化设计界面 报错崩溃掉 但是确不 ...
最新文章
- 【xml】python的lxml库使用
- 一个简单的Java计时器项目,附源码
- while、do while练习——7月24日
- 大白话5分钟带你走进人工智能-第31节集成学习之最通俗理解GBDT原理和过程
- GitOps:Weaveworks通过开发者工具实现CI/CD
- hnu 暑期实训之魔咒词典
- python软件下载3版本-Python 3.7.2和3.6.8版本发布下载,附更新说明
- BCD码干什么用的?
- 理解并取证:IPv6与IPv4在报文结构上的区别
- groupadd命令详解(实例)
- 光储直流微电网simulink仿真模型 双向变换器 ,独立光伏系统能量管理,最大功率点跟踪mppt
- 软件测试简历项目经验该怎么写?【两年经验】
- 房屋租赁合同模板2020 免费下载
- Ubuntu虚拟机使用桥接模式设置IP
- 线粒体靶向的纳米递送PCN-224 纳米粒子-瑞禧
- 高德地图地址解析经纬度以及经纬度解析地址
- Codefroces 760 B. Frodo and pillows
- golang操作chromedp模拟浏览器基础入门
- 【论文翻译|2021】A survey on heterogeneous network representation learning 异构网络表示学习综述
- 大星星学物联网概览篇-硬件
热门文章
- JAVA基础知识之网络编程——-基于AIO的异步Socket通信
- 2016福州大学软件工程第四次团队作业-系统设计成绩汇总
- UILabel的高度自适应
- 【转】jQuery中的bind(),live(),delegate(),on()事件绑定方式的区别
- 参数化的RBAC模型
- 物体成瘾性_科技成瘾使我们不那么快乐。 那是一个市场机会。
- 全量更新和增量更新_增量BIOS更新或直接更新到最新版本哪个更好?
- 原生js打印指定节点元素
- 如何解决90%的报表设计难题?300张报表模板任君挑选
- 读名老中医之路笔记(二)