Silverlight数据验证

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(thisnew 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(thisnullnull) { MemberName = "Name" });
            name = value;
            NotifyChange("Name");
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyChange(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(thisnew PropertyChangedEventArgs(propertyName));
        }
    }

原文地址:https://www.cnblogs.com/sydeveloper/p/2668073.html