当前位置: 首页 > 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个人主页-哔哩哔哩视频

相关文章:

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

一、目的&#xff1a;通过重写DataGrid的OnAutoGeneratingColumn方法实现根据定义特性自动生成列头信息功能 二、实现 <DataGrid ItemsSource"{local:GetStudents Count50}"/>实体定义如下 public class Student{[DataGridColumn("*")][Display(Na…...

八股文之JVM

目录 1.JVM内存划分 2.JVM类加载过程 3.JVM垃圾回收机制GC 3.1.判断谁是垃圾 3.2.如何释放对应的内存 1.JVM内存划分 在一个Java程序运行起来之后&#xff0c;jvm就会从操作系统中申请一块内存&#xff0c;然后就会将该内存划分成多个部分&#xff0c;用于不同的用途。 …...

给wordpress添加限制游客浏览数量功能

wordpress游客只可以浏览5个内容&#xff0c;其它更多的是的需要注册后才能浏览。以下是使用自定义代码来实现这一功能的基本步骤&#xff1a; 创建一个自定义角色&#xff1a; 使用wp_create_roles函数来创建一个名为“访客”的新角色。 该角色将只具有阅读权限。 限制文章…...

[二分枚举]特殊密码锁

描述 有一种特殊的二进制密码锁&#xff0c;由n个相连的按钮组成&#xff08;n<30&#xff09;&#xff0c;按钮有凹/凸两种状态&#xff0c;用手按按钮会改变其状态。 然而让人头疼的是&#xff0c;当你按一个按钮时&#xff0c;跟它相邻的两个按钮状态也会反转。当然&am…...

MT1434 找数字

题目 输入一个字符串(包含26个英文字母大小写及 . 空格&#xff0c;不含其他字符)&#xff0c;把其中连续的数字作为一个整数&#xff0c;依次存放到一个数组中&#xff0c;输出这些整数的和。 格式 输入格式 输入字符串 输出格式 输出整型 样例1 输入&#xff1a; a12…...

2024年6月四六级考试复盘

一、考试情况 1.1四级考试情况 听力&#xff1a;一开始没有进入状态。总共对了9道。7.1*37.1*314.2*3 8.2 新闻听力&#xff1a;3/7 长对话&#xff1a;3/8 讲座/讲话&#xff1a;3/10 阅读&#xff1a;3.55*7 7.1*8 14.2 * 7 181.05 选词填空&#xff1a;保守估计7/1…...

join和left join性能比较

1、join和left join性能比较&#xff08;AI生成&#xff09; 在MySQL中&#xff0c;JOIN和LEFT JOIN的效率并不是绝对的&#xff0c;它们之间的性能差异取决于多种因素&#xff0c;如表的大小、使用的索引、查询的复杂性等。 一般来说&#xff1a; 如果两个表之间的连接条件能…...

Qt正则表达式

需求&#xff1a;对输入的内容进行限制 只能以字母或下划线开始不能以数字开始 不能有中文 字母&#xff0c;数字&#xff0c;下划线混合使用 QRegExp rx("^[A-Za-z_][A-Za-z0-9_]*$");QRegExpValidator validator(rx);QLineEdit edit;edit.setValidator(&va…...

排序-快排算法对数组进行排序

目录 一、问题描述 二、解题思路 1.初始化 2.将右侧小于基准元素移到左边 3.将左侧大于基准元素移到右边 4.重复执行上面的操作 5.对分好的左、右分区再次执行分区操作 6.最终排序结果 三、代码实现 四、刷题链接 一、问题描述 二、解题思路 快排算法实现数组排序&am…...

flink学习-容错机制

checkpoint&#xff08;检查点&#xff09; 在flink中最重要的容错机制&#xff0c;就是checkpoint机制&#xff0c;使用checkpoint可以将之前某个时间点的所有的状态进行保存&#xff0c;这个存档就是checkpoint。 检查点的保存 周期性存储保存&#xff0c;间隔时间可以由用…...

InfluxDB技术分享

InfluxDB是一个开源的时间序列数据库&#xff0c;它被设计用来处理高速写入和查询大量的时间序列数据。以下是一份关于“InfluxDB在Java开发中的使用”的三十分钟技术分享内容概要&#xff1a; 1. 引言 (2分钟) 介绍时间序列数据和时间序列数据库的概念。引入InfluxDB的特点和…...

Windows10安装配置Docker客户端和WSL2与Hyper-V虚拟机

一、需求说明 需要在Windows系统中安装配置Docker的客户端,方便直接管理配置docker镜像容器内容。 二、Windows10安装Docker客户端步骤 2.1、下载安装Docker客户端 对于Windows 10以下的用户,推荐使用Docker Toolbox Windows安装文件:http://mirrors.aliyun.com/docker-…...

EIQ-ABC 分析法在配送中心储位分配中的应用

配送中心运作效率的高低主要取决于仓储业务流程的作业效率&#xff0c;在配送作业流程中&#xff0c;储位分配的是否合理性成为影响配送运作效率的重要因素。为实现储位的合理分配&#xff0c;提出通过对订单信息的分析&#xff0c;并应用 EIQ-ABC 分析法&#xff0c;以此实现缩…...

【安装笔记-20240613-Linux-在 OpenWrt 的 LuCI界面支持命令行调试】

安装笔记-系列文章目录 安装笔记-20240613-Linux-在 OpenWrt 的 LuCI界面支持命令行调试 文章目录 安装笔记-系列文章目录安装笔记-20240613-Linux-在 OpenWrt 的 LuCI界面支持命令行调试 前言一、软件介绍名称&#xff1a;ttyd主页官方介绍特点 二、安装步骤测试版本&#xf…...

React小记(一)_基础部分

1、项目搭建与结构 2、类组件和函数组件 主要区别&#xff1a;1、函数组件没有生命周期2、函数组件没有this指向3、函数组件没有状态4、函数组件通过hooks实现各种操作5、props在函数的第一个参数接收6、函数体相当于类组件的render函数import React from reactfunction App()…...

40、基于深度学习的线性预测设计(matlab)

1、原理及流程 深度学习的线性预测是一种利用深度神经网络模型进行线性回归预测的方法。其设计原理主要基于神经网络的层次化特性&#xff0c;利用多层感知器&#xff08;MLP&#xff09;等模型进行特征学习和非线性变换&#xff0c;从而提高线性预测的准确性。 设计流程如下…...

【初体验 threejs】【学习】【笔记】hello,正方体 3!

前言 为了满足工作需求&#xff0c;我已着手学习 Three.js&#xff0c;并决定详细记录这一学习过程。在此旅程中&#xff0c;如果出现理解偏差或有其他更佳的学习方法&#xff0c;请大家不吝赐教&#xff0c;在评论区给予指正或分享您的宝贵建议&#xff0c;我将不胜感激。 项…...

第04章:IDEA的安装与使用

第04章&#xff1a;随堂复习与企业真题&#xff08;IDEA安装与使用&#xff09; 一、随堂复习 1. IDEA的认识 IDEA(集成功能强大、符合人体工程学&#xff08;设置人性化&#xff09;)Eclipse 2. IDEA的下载、安装、卸载 卸载&#xff1a;使用控制面板进行卸载&#xff0c;…...

[原创][Delphi多线程]使用TMonitor, TEvent和TQueue配合实现TThreadQueue的经典使用案例.

[简介] 常用网名: 猪头三 出生日期: 1981.XX.XX QQ: 643439947 个人网站: 80x86汇编小站 https://www.x86asm.org 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、Delph…...

6.12ctf练习

[西湖论剑 2022]Node Magical Login 源码在这里&#xff1a;GitHub - CTF-Archives/2022-xhlj-web-node_magical_login: A web challenge in 2022 西湖论剑大赛打开 打开环境是个登录框&#xff0c;先进行了扫描和抓包都没有看见什么有价值的东西&#xff0c;看源码 大致连接…...

git -- 替换项目已经存在的 git 远程仓库地址

要将项目中的 Git 远程仓库地址修改为新的地址&#xff08;http://192.168.3.32:9980/java/transketch-portal-backend&#xff09;&#xff0c;你可以按照以下步骤操作&#xff1a;方法一&#xff1a;使用 Git 命令行打开终端或命令提示符导航到你的项目目录运行以下命令&…...

Apache Arrow Rust社区与生态:参与开源项目的最佳路径

Apache Arrow Rust社区与生态&#xff1a;参与开源项目的最佳路径 【免费下载链接】arrow-rs Apache Arrow Rust: 一个Rust语言实现的Apache Arrow数据交换格式&#xff0c;可用于高效地在不同计算引擎之间传输和操作大规模数据。它支持多种数据类型和编码方式&#xff0c;并提…...

C# : 引用类型都存在堆上吗

不完全是&#xff0c;这里要精确区分&#xff1a;引用类型的实例大多数存在堆上&#xff0c;但引用本身不一定在堆上。我们拆开来说&#xff1a;引用类型本身 vs 引用变量对象实例&#xff08;类的实例&#xff09;绝大多数情况下分配在 堆上由 垃圾回收器 管理生命周期引用变量…...

IDEA 2023.3 配置 JavaWeb 项目完整流程:从新建到打包 War 的保姆级避坑指南

IDEA 2023.3 配置 JavaWeb 项目完整流程&#xff1a;从新建到打包 War 的保姆级避坑指南 作为一名长期使用 IntelliJ IDEA 进行 JavaWeb 开发的工程师&#xff0c;我深知在配置项目时可能遇到的各种"坑"。特别是对于刚接触 IDEA 的新手来说&#xff0c;从项目创建到最…...

从拼图游戏到自动驾驶:点云配准技术的跨领域进化史

从拼图游戏到自动驾驶&#xff1a;点云配准技术的跨领域进化史 1. 三维世界的数字拼图师 1987年&#xff0c;当Paul Besl和Neil McKay在实验室里尝试将两组扫描数据对齐时&#xff0c;他们可能不会想到&#xff0c;这项被称为迭代最近点&#xff08;ICP&#xff09;的技术会成为…...

别再死记硬背PCA公式了!用Python+Open3D实战点云法向量估计(附代码)

用Python实战点云法向量估计&#xff1a;从数学原理到Open3D实现 点云处理是计算机视觉和三维重建中的基础任务&#xff0c;而法向量估计则是理解点云局部几何特征的关键步骤。传统教学中&#xff0c;PCA&#xff08;主成分分析&#xff09;往往被简化为一堆数学公式&#xff…...

python基于微信小程序的方言文化传播平台的设计与开发

目录需求分析与规划技术选型与架构设计核心功能实现数据处理与优化测试与部署运营与迭代项目技术支持源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作需求分析与规划 明确平台的核心功能需求&#xff0c;包括方言内容展示、语音录制与分享、…...

从SWF中提取加密通信协议:JPEXS Free Flash Decompiler安全分析报告

从SWF中提取加密通信协议&#xff1a;JPEXS Free Flash Decompiler安全分析报告 【免费下载链接】jpexs-decompiler JPEXS Free Flash Decompiler 项目地址: https://gitcode.com/gh_mirrors/jp/jpexs-decompiler 在网络安全分析领域&#xff0c;SWF&#xff08;Shockwa…...

别再ping IP了!手把手教你给ZeroTier虚拟网络里的设备起个‘好记’的名字(DNS/mDNS实战)

告别IP记忆困扰&#xff1a;ZeroTier网络中的智能命名方案实战指南 每次在ZeroTier虚拟网络中访问设备时&#xff0c;你是否也厌倦了反复查看和输入那串冗长的IP地址&#xff1f;想象一下&#xff0c;当你想连接家庭NAS时&#xff0c;只需输入nas.home就能立即访问&#xff0c…...

Matlab中的QRBiGRU分位数回归双向门控循环单元模型:多图输出与多指标评估的时间序列区间预测

Matlab实现基于QRBiGRU分位数回归双向门控循环单元的时间序列区间预测模型&#xff1a; 1.Matlab实现基于QRBiGRU分位数回归双向门控循环单元的时间序列区间预测模型 2.多图输出、多指标输出(MAE、RMSE、MSE、R2)&#xff0c;多输入单输出&#xff0c;含不同置信区间图、概率密…...