Generalmente il binding two-way di una textbox aggiorna la proprietà a cui è bindata quando il controllo perde il focus.
Poiché però i pulsanti posizionati nel menu non spostano il focus della pagina, vediamo cosa accade in pratica:
Il motivo è semplice: poiché la TextBox che contiene il cognome non ha perso il focus, il binding non ha aggiornato la proprietà sorgente (Binding source) del ViewModel, quindi il controllo della validità dei dati immessi ritorna l’errore. Peggio ancora, poiché di fatto il valore della proprietà bindata suddetta è ancora quello vecchio, nel nostro caso abbiamo un errore perché la nostra logica di business richiede un valore non vuoto e siamo partiti da zero, ma in caso di una maschera di editing dei dati, dove magari vogliamo correggere il valore contenuto nella textbox, di fatto senza accorgerci di nulla il programma utilizzerà il VECCHIO valore e non darà errore perché tale valore non è vuoto.
Se avessimo utilizzato un bottone nella pagina e non un ApplicationBarIconButton, il focus si sarebbe spostato sul bottone stesso e il binding avrebbe completato l’aggiornamento della sorgente senza problema alcuno.
Dunque risulta assolutamente necessario, nello scenario descritto, forzare il binding in modo da aggiornare la sorgente al contenuto delle TextBox e dell’eventuali PasswordBox.
Per farlo si può utilizzare il seguente codice, da inserire nel codice associato all'evento prodotto dal pulsante:
C#:
// Force two-way binding of the editing field
object focusObj = FocusManager.GetFocusedElement();
if (focusObj != null && (focusObj is TextBox || focusObj is PasswordBox))
{
BindingExpression binding;
if (focusObj is TextBox)
{
binding = (focusObj as TextBox).GetBindingExpression(TextBox.TextProperty);
}
else
{
binding = (focusObj as PasswordBox).GetBindingExpression(PasswordBox.PasswordProperty);
}
binding.UpdateSource();
}
That’s all folks!