2021-02-05

WPF中使用IDataErrorInfo进行规则验证

WPF中使用IDataErrorInfo进行数据对象验证

使用 IDataErrorInfo 进行数据对象验证主要有以下步骤:

1、定义一个集合,用于收集错误信息:

private Dictionary<string, string> dataErrors = new Dictionary<string, string>();

2、需要验证的对象的类需要实现 IDataErrorInfo 接口:

  • 具体的数据验证在 this[string columnName] 的 get 访问器中进行。为了防止在处理验证信息时进行大量的条件判断,在这里使用了命名空间 System.ComponentModel.DataAnnotations,将验证条件分离,以 Attribute 的形式关联到每个字段上。
  • 错误信息在这里存储在集合 dataErrors 中,所以需要补充两个方法,用于操作错误dataErrors 。
  • 实现以上处理的 ViewModel 代码如下:
using GalaSoft.MvvmLight;using GalaSoft.MvvmLight.Command;using System;using System.Collections.Generic;using System.ComponentModel;using System.ComponentModel.DataAnnotations;using System.Linq;using System.Text;using System.Text.RegularExpressions;using System.Windows;namespace IDataErrorInfoDemo.ViewModel{ [MetadataType(typeof(MainViewModel))] public class MainViewModel : ViewModelBase, IDataErrorInfo {  public MainViewModel()  {   SaveCommand = new RelayCommand(() =>   {    if (dataErrors.Count == 0) MessageBox.Show("验证通过!");    else    {     StringBuilder sb = new StringBuilder();     sb.Append("验证失败:\r\n");     foreach (var error in dataErrors)     {      sb.Append(error + "\r\n");     }     MessageBox.Show(sb.ToString());    }   });  }  /// <summary>  /// 页面提交命令  /// </summary>  public RelayCommand SaveCommand { get; set; }  private string userName;  /// <summary>  /// 用户名  /// </summary>  [Required]  public string UserName  {   get { return userName; }   set { userName = value; RaisePropertyChanged(); }  }  private String userEmail;  /// <summary>  /// 用户邮件  /// </summary>  [Required]  [StringLength(100, MinimumLength = 2)]  [RegularExpression("^\\s*([A-Za-z0-9_-]+(\\.\\w+)*@(\\w+\\.)+\\w{2,5})\\s*$", ErrorMessage = "邮箱地址填写错误。")]  public String UserEmail  {   get { return userEmail; }   set { userEmail = value; }  }  /// <summary>  /// 错误集合  /// </summary>  private Dictionary<string, string> dataErrors = new Dictionary<string, string>();  //IDataErrorInfo的固定实现  public string Error  {   get;  }  public string this[string columnName]  {   get   {    ValidationContext vc = new ValidationContext(this, null, null);    vc.MemberName = columnName;    var res = new List<ValidationResult>();    var result = Validator.TryValidateProperty(this.GetType().GetProperty(columnName).GetValue(this, null), vc, res);    if (res.Count > 0)    {     string error = string.Join(Environment.NewLine, res.Select(r => r.ErrorMessage).ToArray());     AddDic(dataErrors, vc.MemberName, error);     return error;    }    RemoveDic(dataErrors, vc.MemberName);    return null;   }  }  /// <summary>  /// 移除错误信息  /// </summary>  /// <param name="dics"></param>  /// <param name="dicKey"></param>  private void RemoveDic(Dictionary<string, string> dics, string dicKey)  {   dics.Remove(dicKey);  }  /// <summary>  /// 添加错误信息  /// </summary>  /// <param name="dics"></param>  /// <param name="dicKey"></param>  private void AddDic(Dictionary<string, string> dics, string dicKey,string dicValue)  {   if (!dics.ContainsKey(dicKey)) dics.Add(dicKey, dicValue);  } }}

3、在 View 中对需要验证的元素的 Binding 开启属性 :ValidatesOnDataErrors=True

<TextBox   Text="{Binding UserEmail, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}"   Width="200"   Height="30" />

完整的 View 代码如下:

<Window x: 

4、实现效果如下:

IDataErrorInfo









原文转载:http://www.shaoqun.com/a/527611.html

跨境电商:https://www.ikjzd.com/

ishare:https://www.ikjzd.com/w/2308

菜鸟网络:https://www.ikjzd.com/w/1547


WPF中使用IDataErrorInfo进行数据对象验证使用IDataErrorInfo进行数据对象验证主要有以下步骤:1、定义一个集合,用于收集错误信息:privateDictionary<string,string>dataErrors=newDictionary<string,string>();2、需要验证的对象的类需要实现IDataErrorInfo接口:具体的数
文化衫事件:文化衫事件
vava:vava
口述:你的人回来了心却已不再(4/4):口述:你的人回来了心却已不再(4/4)
2018年12月亚马逊英国站漏斗(Funnels)数据报告:2018年12月亚马逊英国站漏斗(Funnels)数据报告
Shopee信息前瞻 3月复工如何让店铺回到年前排名?:Shopee信息前瞻 3月复工如何让店铺回到年前排名?

No comments:

Post a Comment