当前位置: 首页 > 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;看源码 大致连接…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程

STM32F1 本教程使用零知标准板&#xff08;STM32F103RBT6&#xff09;通过I2C驱动ICM20948九轴传感器&#xff0c;实现姿态解算&#xff0c;并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化&#xff0c;适合嵌入式及物联网开发者。在基础驱动上新增…...