Per rispondere all'approccio di simbay, che ritengo sia stato respinto.
Non è possibile chiamare Annulla in TextChanged perché l'operazione di annullamento è ancora in fase di elaborazione da parte del controllo TextBox. Sembra funzionare a volte e non altre volte, quindi questo suggerisce che c'è una condizione di competizione tra quando viene segnalato l'evento e il completamento della preparazione di annullamento.
Tuttavia, la chiamata di Annulla richiamata sul Dispatcher consente alla casella di testo di completare la preparazione di annullamento. È possibile convalidare i risultati della modifica del testo e decidere se si desidera mantenere o annullare la modifica. Questo potrebbe non essere l'approccio migliore, ma l'ho provato e fatto saltare una serie di modifiche e incolla del testo nella casella di testo e non è stato possibile riprodurre l'eccezione.
La "risposta accettata" è grande solo se si vuole evitare un carattere non valido da essere inserito o incollato, ma in generale ho spesso fare molto di più di validazione dell'input coinvolti TextBox e vogliono verificare il valore del testo finale. Non è facile distinguere il testo finale da un evento di anteprima perché per quanto riguarda il controllo non è ancora successo nulla.
Per rispondere alla domanda di Terribad, la risposta di simbay è migliore e più concisa in più situazioni.
tb.TextChanged =+ (sender, args) =>
{
if(! MeetsMyExpectations(tb.Text))
Dispatcher.BeginInvoke(new Action(() => tb.Undo()));
}
Ho letto un sacco di avventure selvagge nella validazione casella di testo e questo è quanto di più semplice come ho trovato.
Si dovrebbero invece utilizzare i comportamenti. – SepehrM
SepehrM - potresti fornire un esempio? E se non vuoi ancora convalidarlo ma vuoi solo fermare questo maledetto messaggio di eccezione per far saltare la tua sessione? Sto ottenendo questo quando un utente digita un bit troppo veloce o forse incolla un pezzo di dati nel campo. Neanche convalidante. – Allen