3

我有一个表格:Silverlight的验证与数据注释不工作

<StackPanel x:Name="LayoutRoot"> 
    <sdk:ValidationSummary /> 

    <sdk:Label Target="{Binding ElementName=Greeting}" /> 
    <TextBox x:Name="Greeting" Text="{Binding Greeting, Mode=TwoWay, 
     ValidatesOnExceptions=True, NotifyOnValidationError=True}" /> 

    <sdk:Label Target="{Binding ElementName=Name}" /> 
    <TextBox x:Name="Name" Text="{Binding Name, Mode=TwoWay, 
     ValidatesOnExceptions=True, NotifyOnValidationError=True}" /> 
</StackPanel> 

和一个简单的类此设置为DataContext的...

public class Person : INotifyPropertyChanged 
    { 
     private string _greeting; 

     private string _name; 

     public string Greeting 
     { 
      get { return _greeting; } 
      set 
      { 
       _greeting = value; 
       InvokePropertyChanged(new PropertyChangedEventArgs("Greeting")); 
      } 
     } 

     [Required(ErrorMessage = "Name must be provided")] 
     [StringLength(15, MinimumLength = 5, 
      ErrorMessage = "Name should be 5 to 15 characters")] 
     public string Name 
     { 
      get { return _name; } 
      set 
      { 
       _name = value; 
       InvokePropertyChanged(new PropertyChangedEventArgs("Name")); 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 

     public void InvokePropertyChanged(PropertyChangedEventArgs e) 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 
      if (handler != null) handler(this, e); 
     } 
    } 

我设置的数据上下文中有以下line in the code of the xaml:

DataContext = new Person {Name = "Joe User"}; 

我看到窗体上的数据,Name的标签是粗体,表示需要编辑。但是,如果我清空该字段,或者将其设置为无效长度的字符串,则不会在标签本身或验证摘要中进行验证。我知道该文本框不会验证,直到失去焦点,所以我点击进入问候字段并输入文本以确保我已经离开了其他文本控件。

我在这里错过了什么?

答:

每@Alex Paven的回答,得到它与数据注释工作,你可以使用:

[Required(ErrorMessage = "Name must be provided")] 
[StringLength(15, MinimumLength = 5, 
    ErrorMessage = "Name should be 5 to 15 characters")] 
public string Name 
{ 
    get { return _name; } 
    set 
    { 
     Validator.ValidateProperty(value, new ValidationContext(this, null, null) { MemberName = "Name" }); 
     _name = value; 
     InvokePropertyChanged(new PropertyChangedEventArgs("DisplayName")); 
    } 
} 

至于IDataErrorInfo的,我会考虑它。谢谢!

回答

2

您错过了实际验证呼叫。通过ValidatesOnExceptions,必须在属性设置器中引发异常,并且在验证时不会自动考虑属性。为了使它工作,您需要使用正确的参数调用System.ComponentModel.DataAnnotations.Validator.ValidateProperty。

但是,如果使用Silverlight 4,我会建议考虑使用IDataErrorInfo进行验证,因为我觉得它提供了更多的灵活性。

+0

我同意。 IDataErrorInfo是一个更好的方法。在我目前的项目中,我有一个用于ViewModel的基类,它实现了IDataErrorInfo并调用使用FluentValidation库的单独验证类。 – 2010-10-13 18:08:44