SilverlightMVVM模式中的数据校验
silverlight的數(shù)據(jù)校驗(yàn)大體分成3種類型:
以下的數(shù)據(jù)校驗(yàn)方式針對(duì)第二種:
<TextBox Grid.Row="5"Grid.Column="1"Grid.ColumnSpan="2"Width="286"HorizontalAlignment="Left"Text="{Binding EventContent,Mode=TwoWay,NotifyOnValidationError=True,ValidatesOnDataErrors=True}" />
NotifyOnValidationError屬性
該屬性的功能,是當(dāng)驗(yàn)證錯(cuò)誤出現(xiàn)時(shí)是否激活BindingValidationError事件;該屬性是Silverlight獨(dú)有的驗(yàn)證屬性之一,經(jīng)常和ValidatesOnExceptions屬性配合使用。
ValidatesOnDataErrors屬性
獲取或設(shè)置一個(gè)值,該值指示是否包含?DataErrorValidationRule。?DataErrorValidationRule?是內(nèi)置的驗(yàn)證規(guī)則,它檢查由源對(duì)象的?IDataErrorInfo實(shí)現(xiàn)所引發(fā)的錯(cuò)誤。?如果引發(fā)錯(cuò)誤,則綁定引擎將對(duì)該錯(cuò)誤創(chuàng)建一個(gè)?ValidationError?并將其添加到綁定元素的?Validation.Errors?集合中。?如果不存在錯(cuò)誤,將清除此驗(yàn)證反饋,除非另一條規(guī)則引發(fā)驗(yàn)證問題。
<Grid x:Name="LayoutRoot"Grid.Row="0"Grid.Column="0"BindingValidationError="LayoutRoot_BindingValidationError"> ... </Grid>
?
BindingValidationError事件
該事件是一個(gè)路由事件,當(dāng)數(shù)據(jù)驗(yàn)證錯(cuò)誤出現(xiàn)時(shí),將綁定該錯(cuò)誤到數(shù)據(jù)源;也可以簡(jiǎn)單的理解為綁定錯(cuò)誤到數(shù)據(jù)源的一個(gè)行為。該事件可在控件本身調(diào)用,也可在其父控件中調(diào)用。例如,在TextBox中,可以聲明調(diào)用BindingValidationError,或者可以該TextBox的父容器控件Grid,StackPanel中調(diào)用BindingValidationError事件。這里需要注意的是,如果在Silverlight的MVVM設(shè)計(jì)模式下,僅在被驗(yàn)證的控件本身激活BindingValidationError事件,才能正常的被UI捕獲到錯(cuò)誤信息,不支持在父控件中對(duì)BindingValidationError事件進(jìn)行調(diào)用。
private void LayoutRoot_BindingValidationError(object sender, ValidationErrorEventArgs e){if (e.Action == ValidationErrorEventAction.Added){var control = e.OriginalSource as Control;if (control != null)control.Background = new SolidColorBrush(Colors.Yellow);}if (e.Action == ValidationErrorEventAction.Removed){var control = e.OriginalSource as Control;if (control != null)control.Background = new SolidColorBrush(Colors.White);}} 指定當(dāng)發(fā)現(xiàn)驗(yàn)證錯(cuò)誤信息增加時(shí),設(shè)定控件的背景色為黃色,否則為白色。
[Required(ErrorMessage = "事件內(nèi)容必填")][Display(Name = "事件內(nèi)容")]public string EventContent{get { return _eventContent; }set{ClearError();_eventContent = value;RaisePropertyChanged("EventContent");}}
private ICommand _submitCommand;public ICommand SubmitCommand{get{return _submitCommand ?? (_submitCommand = new RelayCommand(() =>{if (Validate())SubmitEvent();}));}set { _submitCommand = value; }}
?數(shù)據(jù)校驗(yàn)Region,可寫在基類中。
#region 數(shù)據(jù)校驗(yàn)#region IDataErrorInfo 成員private string _dataError = string.Empty;private Dictionary<string, string> _dataErrors = new Dictionary<string, string>();public string Error{get { return _dataError; }}public string this[string columnName]{get{if (_dataErrors.ContainsKey(columnName))return _dataErrors[columnName];elsereturn null;}}#endregionpublic void AddError(string name, string error){_dataErrors[name] = error;RaisePropertyChanged(name);}public void RemoveError(string name){if (_dataErrors.ContainsKey(name)){_dataErrors.Remove(name);RaisePropertyChanged(name);}}public void ClearError(){var keys = new string[_dataErrors.Count];_dataErrors.Keys.CopyTo(keys, 0);foreach (var key in keys){this.RemoveError(key);}}public bool Validate(){this.ClearError();var results = new List<ValidationResult>();if (!Validator.TryValidateObject(this, new ValidationContext(this, null, null), results, true)){foreach (var result in results){this.AddError(result.MemberNames.First(), result.ErrorMessage);}return false;}return true;}public void Validate(string name){var results = new List<ValidationResult>();if (Validator.TryValidateProperty(name, new ValidationContext(this, null, null), results)){RemoveError(name);}}#endregion View Code?
點(diǎn)擊確定時(shí):
轉(zhuǎn)載于:https://www.cnblogs.com/tiny-wang/p/3156449.html
總結(jié)
以上是生活随笔為你收集整理的SilverlightMVVM模式中的数据校验的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 当Android工程中提示你找不到头文件
- 下一篇: List列表 OrderBy