Quale evento deve essere utilizzato per aggiornare un modello da TextBox (LostFocus, LostKeyboardFocus, ecc) in WPF? Come impostare la precedenza di eventi in WPF?

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

Domanda

Ho un'applicazione in cui ci sono molte caselle di testo e alcuni pulsanti come Salva, Salva con nome, ecc.
Quando l'utente modifica un TextBox, devo controllare il database per alcuni gamma, convalidare l'intervallo e aggiornare il database. Se c'è un errore nel valore immesso dall'utente, allora non dovrebbe permettere il controllo TextBox alla messa a fuoco perdere.

Stavo usando evento LostFocus per questo ed è stato lavorando bene fino a poco tempo ho scoperto un bug nella mia applicazione.

Bug: L'utente modifica un valore in TextBox e poi fa clic sul pulsante Salva; LostFocus non si chiama così e database non è sempre aggiornato: (

Ora la mia domanda è: quale evento dovrei usare in TextBox per aggiornare il database. Ho provato evento TextChanged ma convalida per ogni personaggio e rendendo la mia domanda lento. Sono confuso in scegliendo l'evento giusto per questo tipo di applicazione!

Nota :! ** I pulsanti sono in diversi UserControl

Modifica 1: Ho alcuni comandi attaccato per fare clic di pulsanti, questi comandi sono sempre eseguito prima LostFocus !! Posso impostare la precedenza o qualcosa del genere comportamenti o comandi annessi dovrebbe ottenere eseguire dopo LostFocus !!

EDIT 2: Stavo solo il debug dell'applicazione disabilitando alcuni comandi, quello che ho trovato è stato in alcuni casi, il DelegateCommand viene eseguito prima di LostFocus, quindi voglio evitarlo. Come posso fare? Mi sono sentito durante lo sviluppo la sua impossibilità di developa applicazione MVVM puro, quindi sono tipo di usare un po 'di codebehind!

È stato utile?

Soluzione

intrappolando il focus della tastiera all'interno di un controllo di solito è un segno di cattiva progettazione dell'interfaccia utente -. È abbastanza user-ostile per forzare l'utente a dati fissi in un controllo prima di poter digitare qualsiasi altra parte del UI

Detto questo, non si dovrebbe utilizzare gli eventi a tutti qui. Stai cercando di scrivere un applicazione Windows Form in WPF. Si dovrebbe scrivere un'applicazione WPF.

Creare una classe che è un modello logico della vostra vista - vale a dire, c'è una proprietà string per la casella di testo e una proprietà Command (o, più probabilmente, un RelayCommand) per il pulsante Salva. Bind la casella di testo per la proprietà di stringa, per esempio:.

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

Perché il UpdateSourceTrigger è PropertyChanged, l'oggetto di origine viene aggiornata ogni volta che l'utente digita un carattere.

Associare il pulsante per la proprietà di comando, per esempio:.

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

Implementare i metodi appropriati CanSave e Save che il RelayCommand (come descritto nella Josh Smith articolo fondamentale sul modello MVVM) richiede, in modo che il pulsante è abilitato quando la proprietà stringa è valida e disabilitata quando non lo è.

Altri suggerimenti

Credo che l'approccio migliore impedisce a un utente di procedere fino a quando tutte le informazioni valide sono state raccolte.

Proprio come una procedura guidata di installazione con Terms & Conditions Dialog e il pulsante Next. Fino a quando si seleziona la casella di controllo I Agree, pulsante Next è disabilitato.

In questo modo, non è necessario preoccuparsi di procedere utente senza fornire informazioni valide. In questo modo, è possibile utilizzare qualsiasi evento su TextBox per convalidare i dati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top