2008-12-02 5 views
4

Je suis en train d'apprendre WPF à partir du développement de WinForms.Annulation d'un événement WPF TextBox modifié

J'ai un événement TextChanged affecté à l'un de mes TextBox dans mon application WPF. Si l'utilisateur entre des données non valides, je souhaite pouvoir revenir à la valeur de texte précédente.

Dans l'ancien jour de formulaires, je remplacerais NewValue par OldValue, mais il semble que WPF ne fonctionne pas de la même manière.

Des idées sur ce que je pouvais faire pour y parvenir? Est-ce que je ne pense pas encore avec WPF?

Merci.

Répondre

20

Vous pouvez le faire de deux façons:

  1. Écoutez l'événement PreviewTextInput et mis e.Handled = true pour arrêter l'événement TextChanged.

  2. Utilisez la validation WPF. Il y a un great post by Paul Stovell on Codeproject et un recent post on his blog.

Ces articles vous aideront à démarrer. une chose qui est restée bloquée lors de la première validation est que la règle de validation ne s'exécute que lorsque la liaison met à jour la source.

+1

Son PreviewTextInput pas PreviewTextChanged! – GuruC

+2

PreviewTextInput ne se déclenche pas si l'utilisateur colle du texte dans la zone de texte. – Abhi

+0

Cela ne fonctionnera pas pour coller dans le 'TextBox' comme la propriété' Text' est définie directement; Si vous souhaitez empêcher de tels événements, vous devrez peut-être ajouter un gestionnaire pour 'ApplicationCommands.Paste'. – Dennis

3

Je voudrais utiliser PreviewTextInput, la plupart des événements dans WPF ont un frère aperçu. Si vous définissez e.Handled = true, l'événement sera interrompu par bubbelig/tunneling. Je ne suis pas sûr si vous êtes au courant de cela, mais les événements de prévisualisation sont censés être tunneling, à savoir. ils commencent à partir du conteneur le plus à l'extérieur et sont affichés dans chaque conteneur jusqu'à ce qu'il atteigne le contrôle qui a le focus. Les événements qui ne sont pas prévisualisés sont censés être bubbeling, c'est-à-dire. ils commencent au contrôle avec focus et sont affichés sur chaque contrôle parent.

Si vous définissez e.Handled = true sur l'événement PreviewTextChanged de la grille la plus externe, vous annulez également tous les autres événements, y compris TextChanged. Tout d'abord, tous les événements de prévisualisation sont déclenchés du plus éloigné vers le contrôle avec le focus, puis tous les événements sans prévisualisation sont déclenchés du contrôle avec focus et sortent vers le contrôle parent le plus externe.

+1

Où est PreviewTextChanged? Je ne peux trouver que PreviewTextInput et TextChanged – Shuo

+0

Je ne suis pas sûr s'il a été renommé ou si je me suis trompé dans le premier cas, mais l'événement correct est PreviewTextInput. –

+0

Edité réponse originale à l'état PreviewTextInput, NOT PreviewTextChanged –

Questions connexes