当前位置: 首页 > news >正文

示例:WPF中应用DataGrid读取实体DisplayAttribute特性自动自动生成列名

一、目的:通过重写DataGrid的OnAutoGeneratingColumn方法实现根据定义特性自动生成列头信息功能


二、实现

<DataGrid ItemsSource="{local:GetStudents Count=50}"/>

实体定义如下 

 public class Student{[DataGridColumn("*")][Display(Name = "姓名", GroupName = "基础信息")][Required]public string Name { get; set; }[DataGridColumn("*")][Display(Name = "班级", GroupName = "基础信息")][Required]public string Class { get; set; }[DataGridColumn("2*")][Display(Name = "地址", GroupName = "基础信息")][Required]public string Address { get; set; }[DataGridColumn("2*")][Display(Name = "邮箱", GroupName = "基础信息")][Required]public string Emall { get; set; }[Display(Name = "可用", GroupName = "其他信息")][Required]public bool IsEnbled { get; set; }[Display(Name = "时间", GroupName = "其他信息")][Required]public DateTime Time { get; set; }[Display(Name = "年龄", GroupName = "基础信息")][Required]public int Age { get; set; }[Display(Name = "分数", GroupName = "成绩信息")]public double Score { get; set; }[DataGridColumn("2*")][Display(Name = "电话号码", GroupName = "基础信息")][Required][RegularExpression("^1[3|4|5|7|8][0-9]{9}$", ErrorMessage = "手机号码不合法!")]public string Tel { get; set; }}

通常如上定义会生成一个根据属性名称列头的表格

三、环境

VS2022

四、示例

自定义一个DislayDataGrid,重写OnAutoGeneratingColumn方法

    public class DislayDataGrid : DataGrid{protected override void OnAutoGeneratingColumn(DataGridAutoGeneratingColumnEventArgs e){base.OnAutoGeneratingColumn(e);if (e.PropertyDescriptor is PropertyDescriptor descriptor)e.Column.Header = descriptor.Attributes.OfType<DisplayAttribute>()?.FirstOrDefault().Name;}}

此时会根据读取特性生成中文名称列头

 

同理其他属性也可以这样设置

 我们扩展一个特性DataGridColumnAttribute

    [AttributeUsage(AttributeTargets.Property, Inherited = false, AllowMultiple = false)]public class DataGridColumnAttribute : Attribute, IDataGridColumn{public DataGridColumnAttribute(string width){DataGridLengthConverter converter = new DataGridLengthConverter();this.Width = (DataGridLength)converter.ConvertFromString(width);}public DataGridColumnAttribute(){}public DataGridLength Width { get; set; } = DataGridLength.Auto;public Type Template { get; set; } = typeof(DataGridTextColumn);/// <summary>/// "{0}.Property"/// </summary>public string PropertyPath { get; set; } = "{0}";public virtual DataGridColumn GetDataGridColumn(PropertyInfo propertyInfo){DataGridColumn dataGridColumn = Activator.CreateInstance(this.Template) as DataGridColumn;if (dataGridColumn == null){if (propertyInfo.PropertyType == typeof(bool)){return new DataGridCheckBoxColumn() { Width = this.Width, IsReadOnly = false };}else if (propertyInfo.PropertyType.IsEnum){return new DataGridComboBoxColumn() { Width = this.Width, IsReadOnly = false };}else{return new DataGridTextColumn() { Width = this.Width, IsReadOnly = false };}}dataGridColumn.Width = this.Width;return dataGridColumn;}}

在生成列时应用该特性

此时列宽也根据特性变化

如果不想通过自定义DisplayDataGrid实现也可以用Behavior行为的方式实现

实现方式如下:

    <DataGrid ItemsSource="{h:GetStudents Count=50}"><b:Interaction.Behaviors><h:DataGridAutoColumnBehavior Type="{x:Type h:Student}"/></b:Interaction.Behaviors></DataGrid>

DataGridAutoColumnBehavior的具体实现方式如下

WPF-Control/Source/Extensions/H.Extensions.Behvaiors/DataGrid/DataGridAutoColumnBehavior.cs at main · HeBianGu/WPF-Control · GitHub

这种方式在自动化生成表格数据中非常有用 

五、需要了解的知识点

DataGrid.OnAutoGeneratingColumn(DataGridAutoGeneratingColumnEventArgs) 方法 (System.Windows.Controls) | Microsoft Learn

DataGrid 类 (System.Windows.Controls) | Microsoft Learn

六、源码地址

GitHub - HeBianGu/WPF-ControlDemo: 示例

GitHub - HeBianGu/WPF-ControlBase: Wpf封装的自定义控件资源库

GitHub - HeBianGu/WPF-Control: WPF轻量控件和皮肤库

七、了解更多

System.Windows.Controls 命名空间 | Microsoft Learn

https://github.com/HeBianGu

HeBianGu的个人空间-HeBianGu个人主页-哔哩哔哩视频

相关文章:

  • redHat9 安装 docker、docker-compose、iptables 过程记录
  • 【人工智能】文本提取技术的算法延伸
  • 免费的录屏软件,分享这5款
  • High-variance latent spaces
  • 一文教你在centos 7.9中安装mysql5.7(超级详细)
  • Zookeeper 一、Zookeeper简介
  • Faiss:加速大规模数据相似性搜索的利器
  • 提高效率的神器:IPython 使用技巧大揭秘
  • MySQL安装教程,包含root账户密码的修改(绿色版安装)---超简单好用
  • DualSPHysics运行报错ERROR: Some boundary particle was excluded.
  • 多线程下JVM内存模型 和 volatile关键字
  • 百度安全X盈科全球数据合规服务中心:推进数据安全及合规智能化创新领域深化合作
  • 什么是网段
  • Javase.String 类
  • MAC配置VScode中C++项目debug环境
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • 【EOS】Cleos基础
  • Angular 响应式表单 基础例子
  • canvas 五子棋游戏
  • CODING 缺陷管理功能正式开始公测
  • java小心机(3)| 浅析finalize()
  • js ES6 求数组的交集,并集,还有差集
  • leetcode讲解--894. All Possible Full Binary Trees
  • Linux后台研发超实用命令总结
  • maya建模与骨骼动画快速实现人工鱼
  • nodejs实现webservice问题总结
  • React-redux的原理以及使用
  • use Google search engine
  • vue脚手架vue-cli
  • 动态魔术使用DBMS_SQL
  • 如何使用 JavaScript 解析 URL
  • 网页视频流m3u8/ts视频下载
  • 消息队列系列二(IOT中消息队列的应用)
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • ​补​充​经​纬​恒​润​一​面​
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #《AI中文版》V3 第 1 章 概述
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (2)Java 简介
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (2024)docker-compose实战 (9)部署多项目环境(LAMP+react+vue+redis+mysql+nginx)
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (文章复现)基于主从博弈的售电商多元零售套餐设计与多级市场购电策略
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • . Flume面试题
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .Family_物联网
  • .JPG图片,各种压缩率下的文件尺寸
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...