<TextBox Name="tb1" Text="{Binding Name,Mode=TwoWay,ValidatesOnExceptions=True}" Height="100" Width="100"/>
后台:
Person p = new Person(); public MainPage() { InitializeComponent(); p.Name = "123"; tb1.DataContext = p; } public class Person : INotifyPropertyChanged { private string name; public string Name { get { return name; } set { if (value.Length > 3) { throw new Exception("不能超过三个字!"); } name = value; NotifyChange("Name"); } } public event PropertyChangedEventHandler PropertyChanged; private void NotifyChange(string propertyName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } }
2.验证TextBox内容不超过指定长度,不失去焦点验证。只需要在上例的基础上为TextBox添加TextChanged事件,并且在事件里通知数据源即可。
private void tb1_TextChanged(object sender, TextChangedEventArgs e)
对验证提示,可以进行样式的设置。
前台添加NotifyOnValidationError属性和BindingValidationError事件
<TextBox Name="tb1" Text="{Binding Name,Mode=TwoWay,ValidatesOnExceptions=True,NotifyOnValidationError=True}" Height="100" Width="100" TextChanged="tb1_TextChanged" BindingValidationError="tb1_BindingValidationError"/>
后台实现BindingValidationError事件
1 private void tb1_BindingValidationError(object sender, ValidationErrorEventArgs e) 2 { 3 if (e.Action == ValidationErrorEventAction.Added) 4 { 5 (sender as TextBox).Background = new SolidColorBrush(Colors.Red); 6 7 } 8 else if (e.Action == ValidationErrorEventAction.Removed) 9 { 10 (sender as TextBox).Background = new SolidColorBrush(Colors.White); 11 } 12 13 }
3.标注的方式验证。要添加System.ComponentModel.DataAnnotations.dll引用,并且将数据源的类定义修成为如下形式:
1 public class Person : INotifyPropertyChanged 2 { 3 private string name; 4 [StringLength(3, ErrorMessage = "不能超过3个字,这是标注的方式验证!")] 5 public string Name 6 { 7 get { return name; } 8 set 9 { 10 Validator.ValidateProperty(value, new ValidationContext(this, null, null) { MemberName = "Name" }); 11 name = value; 12 NotifyChange("Name"); 13 } 14 } 15 public event PropertyChangedEventHandler PropertyChanged; 16 private void NotifyChange(string propertyName) 17 { 18 if (PropertyChanged != null) 19 { 20 PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 21 } 22 } 23 24 }