2009-08-06 5 views
1

Dans Silverlight 3 Je travaille avec un MVVM et aussi le principe de validation que les setters provoquent une exception si une erreur de validation se produit. Je l'aide de la liaison de syntaxe sur les champs à l'aide TwoWay-à-dire:Comment ajouter un bouton de fermeture à ValidationSummary dans Silverlight

<TextBox x:Name="TextBoxClientName" Text="{Binding Name,Mode=TwoWay,ValidatesOnExceptions=True,NotifyOnValidationError=true}" Grid.Column="1" Grid.Row="0" Margin="5 5 5 5" /> 

Je valident cette propriété dans le ViewModel en utilisant les annotations:

[Required(ErrorMessage = "Name is required")] 
public string Name 
{ 
    get 
    { 
     return _client.Name; 
    } 
    set 
    { 
     Validator.ValidateProperty(value, new ValidationContext(this, null, null) { MemberName = "Name", DisplayName="Client Name" }); 
     _client.Name = value; 
    } 
} 

J'ai le résumé de validation et tous fonctionnent bien, mais lol, la fonctionnalité que je recherche est la suivante:

Vous avez le formulaire de données et je veux que le résumé de validation apparaît sur le dessus seulement lorsque je clique sur sauvegarder, et plus encore je veux implémenter un bouton de fermeture sur ce ValidationSummary afin que le l'utilisateur peut continuer avec entrer ing et corrigeant.

Je ne suis pas sûr de savoir comment contrôler la visibilité ou la bascule de la validation, j'ai essayé la visibilité. Ce qui suit est le code que j'ai essayé, qui ne recueille les erreurs sur les présenter, mais je ne peux pas les appliquer à la ValidationSummary:

public void Save() 
    { 
     List<ValidationError> errors = new List<ValidationError>(); 

     foreach (UIElement ui in LayoutRoot.Children) 
     { 
      FrameworkElement fe = ui as FrameworkElement; 

      if (fe != null) 
      { 
       foreach (ValidationError ve in Validation.GetErrors(fe)) 
       { 
        errors.Add(ve); 
       } 
      } 
     } 


     if (errors.Count > 0) 
     { 

      Validation1.DataContext = errors; 
      Validation1.Filter = ValidationSummaryFilters.All; 
     } 
     else 
     { 
      if (Saved != null) 
       Saved(this, EventArgs.Empty); 
     } 

    } 

Cheers,

Andrew

Répondre

1

Je suppose que, par vous » re utilisant SIlverlight 4 dans vos applications. donc cette réponse est pour Silverlight 4.

Avec Silverlight 4 une nouvelle interface a été ajouté INotifyDataError avec 3 méthodes:

public interface INotifyDataErrorInfo 
{ 
    // Returns True if the object has at least one property-level or top-level error. 
    bool HasErrors { get; } 

    // Returns the current set of property-level errors for the provided property name, or 
    // the current top-level errors if the argument is null or empty. 
    IEnumerable GetErrors(string propertyName); 

    // Raised when the set of errors for a particular property has changed, or when the 
    // top-level errors have changed. 
    event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged; 
} 

Il est vaste documentation sur le web au sujet de cette interface et comment l'utiliser.

Vous n'avez pas besoin d'utiliser DataAnotations si vous ne le souhaitez pas. Mais si vous le faites, vous serez toujours en mesure d'obtenir les erreurs de validation en utilisant la classe Validator de l'espace de noms System.ComponentModel.DataAnnotations.

Si vous créez votre ViewModel implémentent INotifyDataError et ont également une propriété (dans le ViewModel) bool IsValidating ou quelque chose comme ça. Ensuite, chaque fois que la propriété change l'événement ErrorsChanged pour toutes les propriétés que vous voulez valider (vous pouvez obtenir les noms de propriété en utilisant la réflexion). Et c'est tout.

Maintenant, il suffit de faire IsValidating = false et puis, lorsque Enregistrer est demandé, affichez les erreurs avec IsValidating = true.

Autre chose que vous pouvez faire (et cela fonctionnerait sur Silverlight 3) est lient la visibilité des ValidationSummary à la propriété IsValidating (en utilisant un IValueConverter), puis contrôler ce à partir du ViewModel.

Questions connexes