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中属性间存在的关系,我们需要编写验证规则如下:
  1. //自定义验证规则
  2. public class StudentValidationRule:ValidationRule
  3. {
  4. public static string errormessage = string.Empty;
  5. public override ValidationResult Validate(object value,
  6. System.Globalization.CultureInfo cultureInfo)
  7. {
  8. errormessage = "";
  9. if (value is BindingGroup)
  10. {
  11. BindingGroup group = (BindingGroup)value;
  12. foreach (var item in group.Items)
  13. {
  14. student st = item as student;
  15. if (string.IsNullOrEmpty(st.Name.Trim()) || string.IsNullOrEmpty(st.Sex.Trim())
  16. || string.IsNullOrEmpty(st.Num.Trim()))
  17. {
  18. errormessage = "姓名、性别、成绩都不能为空!";
  19. return new ValidationResult(false, "姓名、性别、成绩都不能为空!");
  20. }
  21. //Num为A或B则通过,为C则为不通过。
  22. if ((st.Num.Equals("C") && st.Chek) || ((st.Num.Equals("A") || st.Num.Equals("B")) && !st.Chek))
  23. {
  24. errormessage = "分数等级与是否通过不符!";
  25. return new ValidationResult(false, "分数等级与是否通过不符!");
  26. }
  27. }
  28. }
  29. return ValidationResult.ValidResult;
  30. }
  31. }

其中BindingGroup包含用于验证对象绑定和ValidationRule 对象的集合.当我们定义好自己的验证时,我们需要将规则部署到DataGrid上,前台部署:

  1. <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"
  2. RowStyle="{StaticResource RowStyle}" SelectionChanged="dg_SelectionChanged" RowEditEnding="dg_RowEditEnding">
  3. <DataGrid.RowValidationRules>
  4. <local:StudentValidationRule ValidationStep="UpdatedValue"/>
  5. </DataGrid.RowValidationRules>
  6. <DataGrid.Columns>
  7. <DataGridTextColumn Binding="{Binding Path=Name}" Header="姓名" Width="100"/>
  8. <DataGridTextColumn Binding="{Binding Path=Sex}" Header="性别" Width="100"/>
  9. <DataGridTemplateColumn Header="分数" >
  10. <DataGridTemplateColumn.CellTemplate>
  11. <DataTemplate>
  12. <TextBlock Text="{Binding Path=Num}"/>
  13. </DataTemplate>
  14. </DataGridTemplateColumn.CellTemplate>
  15. <DataGridTemplateColumn.CellEditingTemplate>
  16. <DataTemplate>
  17. <ComboBox x:Name="taskcob"
  18. SelectedValue="{Binding Num}"
  19. ItemsSource="{Binding Type,Source={StaticResource So} }"
  20. />
  21. </DataTemplate>
  22. </DataGridTemplateColumn.CellEditingTemplate>
  23. </DataGridTemplateColumn>
  24. <DataGridCheckBoxColumn Binding="{Binding Path=Chek}" Header="是否通过" Width="*"/>
  25. </DataGrid.Columns>
  26. </DataGrid>

如上所示,DataGrid.RowValidationRules(本身就是个BindingGroup)给该Datagrid指定了验证的规则,ValidationStep则设定在何时触发该验证。DataGrid中我们对RowStyle属性进行了设定;也就是当验证未通过时,系统会反馈到界面,提醒用户哪里出错了;对于样式的编写,多种多样,大家可根据自己的喜好编写样式。当datagrid中出现验证错误时,系统将会把编辑行锁定为出错行,此时其他行是禁止被编辑的,直到该行中的验证全部通过为止。

运行如下:

http://blog.csdn.net/zhanglikeno1/article/details/8718096

 
 

WPF中DATAGRID自定义验证(包含BINDINGGROUP)的更多相关文章

  1. WPF中DataGrid自定义实现最后一行下面跟一个汇总行,类似MT4

    1.先看MT4实现的效果:(图中红框部分),其实就是DataGrid在最后一行下面跟一个汇总的显示条 2.看我WPF实现的效果,汇总行中的数据可以绑定哦!效果图如下: 我扩展了一下DataGrid控件 ...

  2. WPF中的数据验证

    数据验证 WPF的Binding使得数据能够在数据源和目标之间流通,在数据流通的中间,便能够对数据做一些处理. 数据转换和数据验证便是在数据从源到目标 or 从目标到源 的时候对数据的验证和转换. V ...

  3. WPF中实现自定义虚拟容器(实现VirtualizingPanel)

    WPF中实现自定义虚拟容器(实现VirtualizingPanel) 在WPF应用程序开发过程中,大数据量的数据展现通常都要考虑性能问题.有下面一种常见的情况:原始数据源数据量很大,但是某一时刻数据容 ...

  4. WPF中datagrid不显示滚动条问题

    WPF中DataGrid是自带滚动条的,当内容显示不下时可以使用滚动条显示.但是,开发中遇到了DataGrid一直不显示滚动条.之前也曾遇到过同类问题,再次经过查找,发现是StackPanel的原因, ...

  5. WPF中DataGrid中的DataGridCheckBoxColumn用法(全选,全否,反选)

    原文:WPF中DataGrid中的DataGridCheckBoxColumn用法(全选,全否,反选) 前台代码 <DataGrid.Columns> <DataGridCheckB ...

  6. Working Experience - WPF 中 DataGrid 控件的应用

    问题: 添加控件后, 编辑单元格会出现异常 绑定 ItemsSource 属性后, 更新绑定对象的数据, UI 不刷新 如何显示控件中 ComboBox 类型 解决方法: 绑定 ItemsSource ...

  7. asp.net mvc 中的自定义验证(Custom Validation Attribute)

    前言

  8. C# wpf中DataGrid 支持汇总行

    最近有一个需求,需要汇总金额,份额等字段.我们使用的是原生的WPF控件,自己开发了一套Template.而没有使用比较成熟的第三方控件.所以这个功能得自己开发.并且要做成控件层次的功能. 当然也可以这 ...

  9. wpf 中DataGrid 控件的样式设置及使用

    本次要实现的效果为: 这个DataGrid需要绑定一个集合对象,所以要先定义一个Experience类,包含三个字段 /// <summary> /// 定义工作经历类 /// </ ...

随机推荐

  1. 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---50

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:

  2. hdu 4523(大整数)

    威威猫系列故事——过生日 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total ...

  3. FZU 1077 铁皮容器 【枚举/二分】

    Accept: 1040    Submit: 2314Time Limit: 1000 mSec    Memory Limit : 32768 KB Problem Description 使用白 ...

  4. [Machine Learning with Python] My First Data Preprocessing Pipeline with Titanic Dataset

    The Dataset was acquired from https://www.kaggle.com/c/titanic For data preprocessing, I firstly def ...

  5. 根据CPU核数合理设置线程池大小

    一般来说池中总线程数是核心池线程数量两倍,只要确保当核心池有线程停止时,核心池外能有线程进入核心池即可. 我们所需要关心的主要是核心池线程的数量该如何设置. 自定义线程池代码 package com. ...

  6. php 经验之谈

    导出excel中文名乱码(保存文件名): hpexcel导出Excel文件时有两个主要的过程: 1.定义文件名 2.填充Excel数据 这两个过程中可能会出现一些乱码问题,下面我来说一下解决办法: 解 ...

  7. iOS7开发技巧

    和任何新的iOS版本一样,有着一堆堆的新技巧和修改需要处理.有些我并不会立即遇到,所以这篇文章并不是一套完整技巧汇总.只是分享一些我碰巧遇到的问题. 如果你有任何更多的发现,可以发Twitter或者e ...

  8. GIS可视化——热点格网图

    一.简介 原理:按照格网大小将区域进行划分,由一个矩形格网替代当前范围内的数据,由格网中心数字代替格网的权重(可以为格网中数据的数量,数据某权重的平均值.最大值.最小值等), 由格网之间颜色的不同表达 ...

  9. RPM命令使用

    RPM是RedHat Package Manager(RedHat软件包管理工具)的缩写 •rpm的常用参数 i:安装应用程序(install) e:卸载应用程序(erase) vh:显示安装进度:( ...

  10. Tomcat Manager用户名和密码

    在浏览器输入http://localhost:8080/,打开Tomcat自带的默认主页面,右侧有“administration”“documentation”等模块.选择“administratio ...