1.验证TextBox内容不超过指定长度,失去焦点后验证。
前台:
<TextBox Name="tb1" Text="{Binding Name,Mode=TwoWay,ValidatesOnExceptions=True}" Height="100" Width="100"/>
后台:
Person p = new Person();
{
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)
System.Windows.Data.BindingExpression expresson = (sender as TextBox).GetBindingExpression(TextBox.TextProperty);
expresson.UpdateSource();
}
对验证提示,可以进行样式的设置。
前台添加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事件
private void tb1_BindingValidationError(object sender, ValidationErrorEventArgs e){
if (e.Action == ValidationErrorEventAction.Added)
{
(sender as TextBox).Background = new SolidColorBrush(Colors.Red);
}
else if (e.Action == ValidationErrorEventAction.Removed)
{
(sender as TextBox).Background = new SolidColorBrush(Colors.White);
}
}
3.标注的方式验证。要添加System.ComponentModel.DataAnnotations.dll引用,并且将数据源的类定义修成为如下形式:
public class Person : INotifyPropertyChanged{
private string name;
[StringLength(3, ErrorMessage = "不能超过3个字,这是标注的方式验证!")]
public string Name
{
get { return name; }
set
{
Validator.ValidateProperty(value, new ValidationContext(this, null, null) { MemberName = "Name" });
name = value;
NotifyChange("Name");
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyChange(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}