La mia impostazione è come descritto di seguito:associazione dei dati non aggiorna la proprietà quando si preme Invio su una finestra con un pulsante predefinito
- WPF 4 applicazione
- MVVM Lite quadro
- Un "Add Item "finestra viene visualizzata nella parte superiore della finestra principale in modalità di dialogo (utilizzando view.ShowDialog();)
- La finestra di dialogo ha un numero di campi di input e il pulsante" Salva "con la proprietà IsDefault impostata su True
- Il pulsante "Salva" è a portata di mano condotto utilizzando un legame con un collegamento di comando
- dati è definita tra i campi nel XAML di vista e le proprietà corrispondenti nella ViewModel (unidirezionale, per l'interfaccia utente per aggiornare il ViewModel, con Mode = OneWayToSource)
Il problema è che quando premo Invio sulla tastiera, il valore che ho fornito nell'ultimo campo di input non viene trasferito alla proprietà sottostante di ViewModel.
Sospetto che ciò abbia a che fare con il fatto che il campo di immissione non ha perso il fuoco prima che la finestra sia chiusa (e quindi tutti i binding sono "disciolti"). Per il confronto, se io clic su il pulsante "Salva" (invece di lasciare che il suo Click sia gestito dalla finestra su Invio), il valore è aggiornato nella proprietà. Inoltre, se aggiungo (horror! Horror!) Un gestore di eventi all'evento Click del pulsante e chiamo button.Focus() nel code-behind, tutto funziona!
Quale può essere il rimedio?
Io, ovviamente, non voglio gestire tutti gli eventi di chiusura della finestra, e "manualmente" recuperare i valori mancanti ... Questo violerebbe l'intero concetto MVVM :-(
Eventuali suggerimenti migliori?
Grazie, Alex
Ho riscontrato questo stesso comportamento anche in un certo numero di altre lingue, in particolare Delphi (presumo che Hejlsberg considerasse questa caratteristica non un difetto, se fosse anche lui responsabile di WPF). L'opzione PropertyChanged ha problemi se ti colleghi a un numero, perché proverà a convalidare "3." mentre digiti in Pi e generi un'eccezione. Non mi interessa l'opzione button.Focus() in quanto funzionerà con tutti i controlli e anche a prova di futuro la finestra di dialogo. –