SilverlightMVVM模式中的数据校验
silverlight的數據校驗大體分成3種類型:
以下的數據校驗方式針對第二種:
<TextBox Grid.Row="5"Grid.Column="1"Grid.ColumnSpan="2"Width="286"HorizontalAlignment="Left"Text="{Binding EventContent,Mode=TwoWay,NotifyOnValidationError=True,ValidatesOnDataErrors=True}" />
NotifyOnValidationError屬性
該屬性的功能,是當驗證錯誤出現時是否激活BindingValidationError事件;該屬性是Silverlight獨有的驗證屬性之一,經常和ValidatesOnExceptions屬性配合使用。
ValidatesOnDataErrors屬性
獲取或設置一個值,該值指示是否包含?DataErrorValidationRule。?DataErrorValidationRule?是內置的驗證規則,它檢查由源對象的?IDataErrorInfo實現所引發的錯誤。?如果引發錯誤,則綁定引擎將對該錯誤創建一個?ValidationError?并將其添加到綁定元素的?Validation.Errors?集合中。?如果不存在錯誤,將清除此驗證反饋,除非另一條規則引發驗證問題。
<Grid x:Name="LayoutRoot"Grid.Row="0"Grid.Column="0"BindingValidationError="LayoutRoot_BindingValidationError"> ... </Grid>
?
BindingValidationError事件
該事件是一個路由事件,當數據驗證錯誤出現時,將綁定該錯誤到數據源;也可以簡單的理解為綁定錯誤到數據源的一個行為。該事件可在控件本身調用,也可在其父控件中調用。例如,在TextBox中,可以聲明調用BindingValidationError,或者可以該TextBox的父容器控件Grid,StackPanel中調用BindingValidationError事件。這里需要注意的是,如果在Silverlight的MVVM設計模式下,僅在被驗證的控件本身激活BindingValidationError事件,才能正常的被UI捕獲到錯誤信息,不支持在父控件中對BindingValidationError事件進行調用。
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);}} 指定當發現驗證錯誤信息增加時,設定控件的背景色為黃色,否則為白色。
[Required(ErrorMessage = "事件內容必填")][Display(Name = "事件內容")]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; }}
?數據校驗Region,可寫在基類中。
#region 數據校驗#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?
點擊確定時:
轉載于:https://www.cnblogs.com/tiny-wang/p/3156449.html
總結
以上是生活随笔為你收集整理的SilverlightMVVM模式中的数据校验的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 当Android工程中提示你找不到头文件
- 下一篇: List列表 OrderBy