WPF&Silverlight数据验证方式汇总
- 格式:docx
- 大小:22.00 KB
- 文档页数:4
数据验证一.数据验证方式可以使用以下任一种方式实现验证1.Exception需要将Binding的ValidatesOnExceptions设为true,当访问数据对象的Set访问器并抛出异常时验证不通过<TextBox Text="{Binding Path=Name, Mode=TwoWay,ValidatesOnExceptions=True}"/>2.IDataError绑定到控件并需要实现验证的对象实现该接口,同时需要将Binding的ValidatesOnDataErrors设为true<TextBox Text="{Binding Path=Name, Mode=TwoWay ,ValidatesOnDataErrors=True}"/>该接口有两个成员:string Error { get; }整个对象的验证错误信息string this[string columnName] { get; }验证时传入属性名获取该字段的验证结果字符串,如果该串为String.Empty或null时则验证通过。
3.DataAnnotations需要引用ponentModel.DataAnnotations.dll使用此方法验证不通过时会引发ValidationException,因此同样需要将Binding的ValidatesOnExceptions设为true将从ValidationAttribute派生的特性置于属性前,然后在Set访问器中调用Validator.ValidateProperty,格式如下:private string _password;[StringLength(6, ErrorMessage="密码不能超过6个字符")]public string Password{get { return _password; }set{Validator.ValidateProperty(value, new ValidationContext(this, null, null) { MemberName = "Password" });_password = value;}}MemberName为属性名,用于获取正确的错误信息。
可自行从ValidationAttribute派生,并重写IsValid方法用于判断是否验证通过。
Framework中已内置了一些此类特性类:(1)Required:用于验证必须有值的属性[Required(ErrorMessage = "必填选项")](2)StringLength:用于验证字符长度[StringLength(6, ErrorMessage="密码不能超过6个字符")](3)RegularExpression:验证字符是否匹配正则表达式[RegularExpression(@"^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$",ErrorMessage="请输入正确的Email格式")](4)验证值的范围[Range(0, 100, ErrorMessage = "请输入年龄值在0 - 100之间")]4.INotityDataErrorInfo(Silverlight4以下版本和WPF中不支持)绑定到控件并需要实现验证的对象实现该接口该接口有三个成员:bool HasErrors { get; }event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;IEnumerable GetErrors(string propertyName);验证步聚如下:当输入的值由验证通过变为验证不通过或者由验证不通过变为验证通过时由程序员显式触发ErrorsChanged事件(验证过程可以在一个单独的线程中完成,如用户在界面上录入数据后,启动一个线程查询数据库并对数据进行验证,但触发该事件必须在UI上完成),验证的引擎接收到该事件后先访问HasErrors查看是否存在错误,最后再访问GetErrors方法获取具体错误信息。
如下列代码,调用Validate方法在一个线程中异步对Name属性进行验证,当属性值等于“abc”时验证不通过。
private Dictionary<string, List<string>> _errors = new Dictionary<string, List<string>>();#region INotifyDataErrorInfo Memberspublic event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;public System.Collections.IEnumerable GetErrors(string propertyName){return _errors[propertyName];}public bool HasErrors{get{return _errors.Count>0;}}#endregionprivate void AddErrors(string propertyName,string errorMessage){if (!_errors.ContainsKey(propertyName)){_errors.Add(propertyName,new List<string>());}_errors[propertyName].Add(errorMessage);}private void RemoveErrors(string propertyName){_errors.Remove(propertyName);}private void OnErrorsChanged(string propertyName){_uiDispatcher.BeginInvoke(new Action(delegate() {if(ErrorsChanged!=null)ErrorsChanged(this,new DataErrorsChangedEventArgs(propertyName));}));}private void Validate(){Thread thread = new Thread(new ThreadStart(AsyncValidate));thread.Start();}private void AsyncValidate(){if (_name == "abc"){AddErrors("Name", "error");}else{RemoveErrors("Name");}OnErrorsChanged("Name");}5.ValidationRule(Silverlight中不支持)(1)从ValidationRule派生验证规则类public class LengthValidationRule:ValidationRule{public int MinLength { get; set; }public int MaxLength { get; set; }public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo){int length=value.ToString().Length;if (length < MinLength || length > MaxLength)return new ValidationResult(false, "The length is invalid");elsereturn ValidationResult.ValidResult;}}(2)将验证规则添加到Binding对象的ValidataionRules集合<TextBox x:Name="txtPassword" Width="200"><TextBox.Text><Binding Path="Password"><Binding.ValidationRules><local:LengthValidationRule MinLength="3" MaxLength="6"/></Binding.ValidationRules></Binding></TextBox.Text></TextBox>二.错误信息显示当数据验证失败时,控件会出现红色边框,在Silverlight中可同时显示错误的详细信息,但WPF中需要显示详细信息时可以使用以下方式之一处理。
1.BindingValidationError事件处理绑定的控件或其父容器的BindingValidationError事件,如果是处理父容器事件,可以通过BindingValidationEventArgs.OriginalSource获取引发验证错误的原始控件。
2.在窗体构造函数中添加如下代码:Validation.AddErrorHandler(this.txtUserName, delegate(object sender, ValidationErrorEventArgs e){//当txtUserName控件验证未通过时此处代码被调用MessageBox.Show(e.Error.ErrorContent.ToString());});以上代码需要将NotifyOnValidationError设为True才能生效。
<TextBox Text="{Binding Path=Name, Mode=TwoWay, NotifyOnValidationError=True }"/>。