2009-12-19 4 views
1

J'ai l'application Silverlight 3 avec deux datepickers pour la date de début et la date de fin. Ce sont des données liées à un objet métier qui implémente une logique de validation de telle sorte que StartDate doit être avant EndDate et que EndDate doit l'être après le StartDate. Jusqu'à présent, tout va bien - les deux contrôles affichent l'erreur de validation appropriée lorsqu'une exception de validation est levée dans le setter respectif. Mon problème est que si l'utilisateur change le contrôle 'autre' de telle sorte que la date 'invalide' dans le premier contrôle est maintenant valide, l'état du premier contrôle ne change pas (parce que son setter n'a pas été appelé). Par exemple, si je définis StartDate sur 15 Dec 2009 et EndDate sur 10 Dec 2009, le contrôle EndDate passe correctement à l'état non valide. Si l'utilisateur modifie le StartDate au 9 décembre 2009, le contrôle EndDate est toujours marqué comme non valide car l'interface utilisateur n'a pas appelé le setter EndDate.Validation Silverlight des contrôles dépendants?

Existe-t-il une méthode de type MVVM «propre» pour forcer l'interface utilisateur à revalider?

Répondre

1

utiliser la classe ValidationScope de here Fondamentalement, il vous permet de regrouper quelques contrôles et de valider ce groupe lorsqu'une commande donnée est déclenchée, fonctionne bien pour les choses standard.

Xaml pour quelques zones de texte

<StackPanel local:ValidationScope.ValidationScope="{Binding PersonValidationScope}"> 
     <TextBox 
      Text="{Binding Person.Name, Mode=TwoWay, ValidatesOnExceptions=True, NotifyOnValidationError=True}" 
      local:ValidationScope.ValidateBoundProperty="Text" /> 
     <TextBox 
      Text="{Binding Person.Age, Mode=TwoWay, ValidatesOnExceptions=True, NotifyOnValidationError=True}" 
      local:ValidationScope.ValidateBoundProperty="Text" /> 
     <ComboBox 
      ItemsSource="{Binding Salutations}"  
     SelectedItem="{Binding Person.Salutation, Mode=TwoWay, NotifyOnValidationError=True, ValidatesOnExceptions=True}" 
    local:ValidationScope.ValidateBoundProperty="SelectedItem" /> 
    <Button Content="Save" Click="SaveButtonClick" /> 
</StackPanel> 

ViewModel ressemble à ce

public void Save() 
{ 
    // This causes all registered bindings to be updated 
    PersonValidationScope.ValidateScope(); 
    if (PersonValidationScope.IsValid()) 
    { 
     // Save changes! 
    } 
} 

Suivez le lien pour la classe ValidationScope.

+0

Merci Neil, ça fait bien l'affaire. –

Questions connexes