3

J'ai une forme:Silverlight validation ne fonctionne pas avec annotations données

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

Et une simple classe cela est défini comme 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); 
     } 
    } 

Je mis le contexte de données avec les éléments suivants ligne dans le code sous-jacent de la xaml:

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

je vois les données sur la forme, et l'étiquette de nom est en gras, indiquant requir éd. Cependant, si je vide le champ, ou si je le mets à une chaîne d'une longueur invalide, je n'obtiens aucune validation, sur l'étiquette elle-même, ou sur le résumé de validation. Je comprends que la zone de texte ne valide pas jusqu'à la mise au point perdue, donc je clique dans le champ d'accueil et saisis le texte pour m'assurer que j'ai laissé l'autre contrôle de texte.

Qu'est-ce qui me manque ici?

Réponse:

par la réponse Paven @ Alex, pour le faire fonctionner avec annotations de données que vous utilisez:

[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")); 
    } 
} 

Quant à IDataErrorInfo, je vais examiner. Merci!

Répondre

2

Il vous manque l'appel de validation réel. Avec ValidatesOnExceptions, une exception doit être levée dans le setter de propriétés, et les attributs ne sont pas pris en compte automatiquement en ce qui concerne la validation. Pour que cela fonctionne, vous devez appeler System.ComponentModel.DataAnnotations.Validator.ValidateProperty avec les paramètres corrects. Cependant, si j'utilise Silverlight 4, je suggère de vérifier avec IDataErrorInfo, car je pense que cela offre beaucoup plus de flexibilité.

+0

Je suis d'accord. IDataErrorInfo est une meilleure façon de faire. Sur mon projet actuel, j'ai une classe de base pour mes ViewModels qui implémente IDataErrorInfo et appelle des classes de validation séparées qui utilisent la bibliothèque FluentValidation. –