2010-11-16 9 views
1

J'ai un contrôle utilisateur Silverlight avec quelques champs qui sont liés via des services RIA à une base de données. J'utilise NotifyOnValidationError = true, ValidatesOnExceptions = true sur ces champs et un contrôle ValidationSummary pour montrer les erreurs avec les champs. Tout cela fonctionne très bien.Comment puis-je connaître l'état de validation d'un contrôle utilisateur Silverlight?

Cependant, sur la commande usercontrol j'ai un bouton "Save" qui appellera context.SubmitChanges() quand on cliquera dessus. Le problème est que ce bouton peut être cliqué (et donc appelé SubmitChanges) même s'il y a encore des erreurs présentes.

Comment puis-je déterminer si des erreurs de validation sont toujours présentes ou est-ce qu'il y a un lien quelconque entre la propriété IsEnabled du bouton Enregistrer et l'état de validation?

Répondre

2

Pour que le bouton de sauvegarde ne soit plus disponible en présence d'erreurs de validation côté client, vous pouvez essayer cette option.

Dans votre classe (code behind ou view model) vous aurez quelque chose qui fournit l'instance actuelle d'une entité RIA avec laquelle vous travaillez.

public SampleRIAEntity SelectedEntity { get; set; } 

En utilisant cette méthode d'extension:

public static class RiaExtensions 
{ 
    public static bool CheckValidation<T>(this T riaEntity) where T : Entity 
    { 
    ValidationContext vc = new ValidationContext(riaEntity, null, null); 
    ICollection<ValidationResult> validationResults = new List<ValidationResult>(); 
    return (Validator.TryValidateObject(riaEntity, vc, validationResults) == true); 
    } 
} 

Vous pouvez fournir une propriété à utiliser avec le IsEnabled sur le bouton Enregistrer.

public bool HasErrors 
{ 
    get 
    { 
    return SelectedEntity.CheckValidation<SampleRIAEntity>(); 
    } 
} 

Cela passerait ensuite par toutes les règles de validation disponibles côté client. La sauvegarde ne peut toujours pas être validée si des règles côté serveur ne sont pas satisfaites.

1

Vous pouvez lier la propriété IsEnabled du bouton de sauvegarde au champ HasErrors du contrôle ValidationSummary. Cela désactivera le bouton tant que le résumé de validation est visible. Vous aurez besoin d'utiliser un convertisseur pour inverser la valeur de HasErrors

Voici le XAML:

 
    <UserControl .... >  
       <UserControl.Resources>  
           <Converters1:NotBoolConverter x:Key="NotBoolConverter" /> 
        </UserControl.Resources>  

        <Button IsEnabled="{Binding HasErrors, ElementName=valSummary, Converter={StaticResource NotBoolConverter}}" />  

Voici le code pour le NotBoolConverter: (de http://forums.silverlight.net/forums/p/78115/184444.aspx)

internal class NegationConverter : IValueConverter 
{ 
    #region IValueConverter Members  
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)  
    { var b = (bool) value; return !b; }  

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { throw new NotImplementedException(); }  
    #endregion  
}