WPF中DATAGRID自定义验证(包含BINDINGGROUP)
DataGrid在Wpf中的应用是十分广泛的,当你需要表中的信息稍详细的显示出来时,或者我们需要进行某些数据输入时,都有可能采用DataGrid。当然对信息的显示,我们不需要进行验证,但当我们将DataGrid作为输入工具时,输入的数据要符合相应的规则后才能通过,这时我们就需呀进行验证了。
对于DataGrid的验证有两种,一种是对每个DataGridCell而言的,也就是说当每个被验证的Cell编辑完成后,就会触发验证;另一种是针对DataGridRow而言的,就是当整行编辑完成之后触发验证。两者的选择就要根据具体的情况而定了。
对于验证的实现,一般也分为两种方法,一种是实现IDataErrorInfo接口来完成验证,另一种则是需要继承ValidationRule来完成自定义的验证。本文主要针对后者进行说明。随后也会附上DEMO。
我们在WPF页中用DataGrid对多有的学生Student信息进行显示,但更重要的是我们要在DataGrid中对学生列表进行新增或编辑。
其中Student类中定义了Name、Sex、Num、Check等属性,对每个Student的每个属性我们要求都不为空,对于这点,我们用整行验证和各个Cell进行验证都是可以的,但是对于Num和check我们有要求:Num为分数等级,只有当它为A或B的时候Check才为true(表通过),这时用整行的验证做起来比较简单,也就是说当验证每个实体属性间关系时用整行验证来说比较方便。
要验student中属性间存在的关系,我们需要编写验证规则如下:
- //自定义验证规则
- public class StudentValidationRule:ValidationRule
- {
- public static string errormessage = string.Empty;
- public override ValidationResult Validate(object value,
- System.Globalization.CultureInfo cultureInfo)
- {
- errormessage = "";
- if (value is BindingGroup)
- {
- BindingGroup group = (BindingGroup)value;
- foreach (var item in group.Items)
- {
- student st = item as student;
- if (string.IsNullOrEmpty(st.Name.Trim()) || string.IsNullOrEmpty(st.Sex.Trim())
- || string.IsNullOrEmpty(st.Num.Trim()))
- {
- errormessage = "姓名、性别、成绩都不能为空!";
- return new ValidationResult(false, "姓名、性别、成绩都不能为空!");
- }
- //Num为A或B则通过,为C则为不通过。
- if ((st.Num.Equals("C") && st.Chek) || ((st.Num.Equals("A") || st.Num.Equals("B")) && !st.Chek))
- {
- errormessage = "分数等级与是否通过不符!";
- return new ValidationResult(false, "分数等级与是否通过不符!");
- }
- }
- }
- return ValidationResult.ValidResult;
- }
- }
其中BindingGroup包含用于验证对象绑定和ValidationRule 对象的集合.当我们定义好自己的验证时,我们需要将规则部署到DataGrid上,前台部署:
- <DataGrid AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="True" Canvas.Top="0" Name="dg" Width="500" IsReadOnly="False" BeginningEdit="dg_BeginningEdit" CellEditEnding="dg_CellEditEnding" LostFocus="dg_LostFocus" SelectedCellsChanged="dg_SelectedCellsChanged"
- RowStyle="{StaticResource RowStyle}" SelectionChanged="dg_SelectionChanged" RowEditEnding="dg_RowEditEnding">
- <DataGrid.RowValidationRules>
- <local:StudentValidationRule ValidationStep="UpdatedValue"/>
- </DataGrid.RowValidationRules>
- <DataGrid.Columns>
- <DataGridTextColumn Binding="{Binding Path=Name}" Header="姓名" Width="100"/>
- <DataGridTextColumn Binding="{Binding Path=Sex}" Header="性别" Width="100"/>
- <DataGridTemplateColumn Header="分数" >
- <DataGridTemplateColumn.CellTemplate>
- <DataTemplate>
- <TextBlock Text="{Binding Path=Num}"/>
- </DataTemplate>
- </DataGridTemplateColumn.CellTemplate>
- <DataGridTemplateColumn.CellEditingTemplate>
- <DataTemplate>
- <ComboBox x:Name="taskcob"
- SelectedValue="{Binding Num}"
- ItemsSource="{Binding Type,Source={StaticResource So} }"
- />
- </DataTemplate>
- </DataGridTemplateColumn.CellEditingTemplate>
- </DataGridTemplateColumn>
- <DataGridCheckBoxColumn Binding="{Binding Path=Chek}" Header="是否通过" Width="*"/>
- </DataGrid.Columns>
- </DataGrid>
如上所示,DataGrid.RowValidationRules(本身就是个BindingGroup)给该Datagrid指定了验证的规则,ValidationStep则设定在何时触发该验证。DataGrid中我们对RowStyle属性进行了设定;也就是当验证未通过时,系统会反馈到界面,提醒用户哪里出错了;对于样式的编写,多种多样,大家可根据自己的喜好编写样式。当datagrid中出现验证错误时,系统将会把编辑行锁定为出错行,此时其他行是禁止被编辑的,直到该行中的验证全部通过为止。
运行如下:
WPF中DATAGRID自定义验证(包含BINDINGGROUP)的更多相关文章
- WPF中DataGrid自定义实现最后一行下面跟一个汇总行,类似MT4
1.先看MT4实现的效果:(图中红框部分),其实就是DataGrid在最后一行下面跟一个汇总的显示条 2.看我WPF实现的效果,汇总行中的数据可以绑定哦!效果图如下: 我扩展了一下DataGrid控件 ...
- WPF中的数据验证
数据验证 WPF的Binding使得数据能够在数据源和目标之间流通,在数据流通的中间,便能够对数据做一些处理. 数据转换和数据验证便是在数据从源到目标 or 从目标到源 的时候对数据的验证和转换. V ...
- WPF中实现自定义虚拟容器(实现VirtualizingPanel)
WPF中实现自定义虚拟容器(实现VirtualizingPanel) 在WPF应用程序开发过程中,大数据量的数据展现通常都要考虑性能问题.有下面一种常见的情况:原始数据源数据量很大,但是某一时刻数据容 ...
- WPF中datagrid不显示滚动条问题
WPF中DataGrid是自带滚动条的,当内容显示不下时可以使用滚动条显示.但是,开发中遇到了DataGrid一直不显示滚动条.之前也曾遇到过同类问题,再次经过查找,发现是StackPanel的原因, ...
- WPF中DataGrid中的DataGridCheckBoxColumn用法(全选,全否,反选)
原文:WPF中DataGrid中的DataGridCheckBoxColumn用法(全选,全否,反选) 前台代码 <DataGrid.Columns> <DataGridCheckB ...
- Working Experience - WPF 中 DataGrid 控件的应用
问题: 添加控件后, 编辑单元格会出现异常 绑定 ItemsSource 属性后, 更新绑定对象的数据, UI 不刷新 如何显示控件中 ComboBox 类型 解决方法: 绑定 ItemsSource ...
- asp.net mvc 中的自定义验证(Custom Validation Attribute)
前言
- C# wpf中DataGrid 支持汇总行
最近有一个需求,需要汇总金额,份额等字段.我们使用的是原生的WPF控件,自己开发了一套Template.而没有使用比较成熟的第三方控件.所以这个功能得自己开发.并且要做成控件层次的功能. 当然也可以这 ...
- wpf 中DataGrid 控件的样式设置及使用
本次要实现的效果为: 这个DataGrid需要绑定一个集合对象,所以要先定义一个Experience类,包含三个字段 /// <summary> /// 定义工作经历类 /// </ ...
随机推荐
- Python学习杂记_11_函数(一)
函数也叫方法,就是把实现某种功能的一组代码封装起来,当你需要这个功能时直接调用函数即可. 定义函数:定义函数时要注意 “def”关键字,“:”,“函数体缩进”:用“return”使函数有具体返回值,没 ...
- MySQL自增锁模式innodb_autoinc_lock_mode参数理解调优
前段时间某数据表运行过程中,出现自增字段突然跳跃式增长的问题,潜心研究发现,问题导致原因可能是因为并发写入导致 于是通过各种途径查阅是因为innodb_autoinc_lock_mode参数设置的不同 ...
- c# redis 利用锁(StackExchange.Redis LockTake)来保证数据在高并发情况下的正确性
之前有写过一篇介绍c#操作redis的文章 http://www.cnblogs.com/axel10/p/8459434.html ,这篇文章中的案例使用了StringIncrement来实现了高并 ...
- Gym 101064 D Black Hills golden jewels 【二分套二分/给定一个序列,从序列中任意取两个数形成一个和,两个数不可相同,要求求出第k小的组合】
D. Black Hills golden jewels time limit per test 2 seconds memory limit per test 256 megabytes input ...
- sprintf 心得
[string print format]sprintf指的是字符串格式化命令. [主要功能]是把格式化的数据写入某个字符串中. sprintf是个变参函数. 使用sprintf对于写入buffer的 ...
- 网站优化—mysql explain执行计划
explain执行计划 简介MySQL调优: 先发现问题(慢查询,profile) 对于使用索引和没有使用索引,了解到索引可以快速去查找数据 了解什么是索引(索引是排好序的快速查找的数据结构) 索引的 ...
- 注意这几点,轻轻松松配置 Nginx + Tomcat 的集群和负载均衡
Tomcat 集群是当单台服务器达到性能瓶颈,通过横向扩展的方式提高整体系统性能的有效手段.Nginx 是一个高性能的 HTTP 和反向代理 web 服务器,可以通过简单的配置实现 Tomcat 集群 ...
- 洛谷2085最小函数值(minval) + 洛谷1631序列合并
题目描述 有n个函数,分别为F1,F2,-,Fn.定义Fi(x)=Ai*x^2+Bi*x+Ci (x∈N*).给定这些Ai.Bi和Ci,请求出所有函数的所有函数值中最小的m个(如有重复的要输出多个). ...
- Linux使用cd回到上一目录
//返回上一级目录 cd .. //返回用户主目录 cd 或 cd ~ //返回根目录 cd /
- Docking For WPF–AvalonDock
桌面程序的应用,不可避免的就会用到大量的布局控件,之前的一个项目也想过去做类似于Visual Studio的那种灵活的布局控件,也就是界面上的控件能够实现拖拽放置.隐藏.窗口化等一系列的操作,但由于开 ...