Quel événement devrait être utilisé pour mettre à jour un modèle de TextBox (LostFocus, LostKeyboardFocus, etc.) dans WPF? Comment définir l'ordre des événements dans WPF?

StackOverflow https://stackoverflow.com/questions/4447645

Question

J'ai une application dans laquelle il y a beaucoup de zones de texte et quelques boutons comme Save, SaveAs, etc.
Lorsque l'utilisateur édite une zone de texte, je dois vérifier la base de données pour une certaine gamme, valider la gamme et mettre à jour la base de données. S'il y a une erreur de valeur saisie par l'utilisateur, alors je ne devrais pas permettre à la zone de texte à perdre le focus.

J'utilisais événement LostFocus pour cela et il fonctionnait très bien jusqu'à ce que ces derniers temps j'ai découvert un bug dans mon application.

Bug: L'utilisateur édite une valeur TextBox puis clique sur le bouton Enregistrer; l'événement LostFocus est pas appelé et si la base de données ne reçoit pas mise à jour: (

Maintenant, ma question est quel événement dois-je utiliser dans TextBox pour mettre à jour la base de données. J'ai essayé événement TextChanged mais il valide pour chaque caractère et de faire ma demande lente. Je suis confus dans l'événement chosing pour ce genre d'application!

Remarque : ** Les boutons sont différents UserControl

EDIT 1: J'ai quelques commandes attaché à cliquer sur des boutons, ces commandes sont exécutées avant de se LostFocus !! Puis-je définir la priorité ou quelque chose comme des comportements ou des commandes jointes doivent sont exécutées après LostFocus !!

EDIT 2: je débogage juste l'application en désactivant certaines commandes, ce que j'ai trouvé dans certains cas, le DelegateCommand est exécuté avant LostFocus, donc je veux éviter cela. Comment puis-je aller à ce sujet? Je me sentais au cours du développement il est impossible de developa pur application MVVM donc je suis un peu en utilisant un peu de codebehind!

Était-ce utile?

La solution

Piégeage le focus du clavier dans un contrôle est généralement un signe d'une mauvaise conception de l'interface utilisateur -. Il est assez utilisateur hostile pour forcer l'utilisateur à des données fixes dans un contrôle avant qu'il ne puisse entrer nulle part ailleurs dans l'interface utilisateur

Cela dit, vous ne devriez pas utiliser les événements du tout ici. Vous essayez d'écrire une application Windows Forms dans WPF. Vous devriez écrire une application WPF.

Créer une classe qui est un modèle logique de votre point de vue - à savoir, il y a une propriété string pour la zone de texte et une propriété Command (ou, plus probablement, un RelayCommand) pour le bouton Enregistrer. Lier la zone de texte à la propriété de chaîne, par exemple:.

<TextBox Text="{Binding MyTextProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>

Parce que la UpdateSourceTrigger est PropertyChanged, l'objet source sera mise à jour chaque fois que l'utilisateur tape un caractère.

Bind le bouton à la propriété de commande, par exemple:.

<Button CommandBinding="{Binding SaveCommand}">Save</Button>

Mettre en œuvre les méthodes de CanSave et Save appropriés que le RelayCommand (tel que décrit dans Josh Smith article essentiel sur le modèle MVVM) exige, de sorte que le bouton est activé lorsque la propriété de chaîne est valide et désactivé lorsque ce n'est pas.

Autres conseils

Je pense que la meilleure approche est d'empêcher un utilisateur de procéder jusqu'à ce que toutes les informations valides ont été recueillies.

Tout comme un assistant d'installation avec Terms & Conditions Dialog et bouton Next. Jusqu'à ce que vous cochez la case I Agree, bouton Next est désactivé.

De cette façon, vous n'avez pas à vous soucier de procédure utilisateur sans fournir des informations valides. De cette façon, vous pouvez utiliser tout événement sur TextBox pour valider vos données.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top