2010-01-18 7 views
1

J'ai travaillé avec WPF et le modèle MVVM pendant un moment maintenant. J'ai du mal à faire fonctionner la validation de manière "normale":Validation de formulaire dans WPF

1) J'implémente l'interface IDataErrorInfo dans mon ViewModel. Le XAML ressemble à:

<TextBox Grid.Column="1" 
     Grid.Row="1" 
     Text="{Binding Path=ProjectKey, ValidatesOnDataErrors=True, UpdateSourceTrigger=LostFocus}" /> 

Le problème ici est que si les déclencheurs LostFocus et PropertyChanged sont utilisés, la zone de texte est validée avant que l'utilisateur jamais onglets de ce contrôle. Cela signifie que si je valide des champs vides, l'utilisateur verra beaucoup de rouge lors de la première ouverture du formulaire. Idéalement, l'entrée ne sera validée qu'après le premier "focus perdu" ou "changement de propriété", ou une fois que le bouton "Soumettre" est cliqué.

2) L'autre problème est la validation à la fin lorsque l'utilisateur clique sur "Envoyer". Il y a certaines choses que vous voulez valider juste avant de soumettre à la base de données, telles que les doublons. Je comprends que je peux utiliser UpdateSourceTrigger = Explicit et appeler la méthode UpdateSource sur tous les contrôles. Je me demande s'il existe un moyen approprié de le faire dans le modèle MVVM. Il semble que ce code ne devrait pas être dans le ViewModel car il est très spécifique à View ...

Toutes les idées seraient super. J'ai cherché beaucoup semblent en ligne mais ne peut pas trouver la bonne solution ...

+0

http://stackoverflow.com/questions/2821998/how-can-i-get-wpf-to-not-display-validation-errors-upon-initial-display-of-contro/2829884#2829884 pourrait résoudre les deux problèmes – nash

Répondre

0

Pour le numéro un de vos propriétés sur le ViewModel doivent être initialisés avec une valeur avant la main dans le constructeur

public double Property1 {get; set;} 

    public ViewModel() 
{ 
    Property1 = 0; 
} 

Pour le numéro deux, le bouton d'envoi ne doit pas être activé tant que tous les champs n'ont pas été validés. Si vous avez un champ unique dans la base de données, validez-le sur le changement de propriété et l'affichage et l'erreur s'il ne passe pas. Vous pouvez avoir une propriété booléenne liée à la propriété IsEnabled du bouton et la définir sur true une fois que tous les champs ont été validés.

+0

J'ai suivi cet exemple de Josh Smith: http://joshsmithonwpf.wordpress.com/2008/11/14/using-a-viewmodel-to-provide-meaningful-validation-error-messages/ –