Silverlight数据验证

说明:本文出处:http://www.cnblogs.com/sydeveloper/archive/2012/09/03/2668073.html

前台:

<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事件

 

View Code
 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引用,并且将数据源的类定义修成为如下形式:

View Code
 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 } 

 

posted @ 2013-03-10 14:51  银河系上的地球  阅读(168)  评论(0编辑  收藏  举报