1.验证TextBox内容不超过指定长度,失去焦点后验证。
前台:
<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)
{
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));
}
}
}