Dopo aver presentato il contesto (I° parte) e una dimostrazione (II° parte) voglio concludere con una mia considerazione al riguardo, visto che Julio Di Egidio (aka LudovicoVan) è stato così stoico da vedersi tutto il video (lo ammetto, sono a dir poco soporifero) e lasciare un commento.
Come lascia intendere il titolo del post, il comportamento di WPF è in parte una feature, quando inibisce il round trip del binding two way sul componente attivo (la textbox di cui stiamo editando il contenuto) perché evita di andare in loop e di modificarmi sotto il naso il valore che sto editando, e IMHO un errore quando uscendo dal componente il valore non viene aggiornato al valore bindato.
Julio in un suo commento alla II° parte del mio post mi chiede come avrei fatto io. Semplice: poichè il componente con il focus riceve comunque l'evento NotifyPropertyChanged e lo ignora (giustamente visto che ha il focus), WPF potrebbe fare in due modi:
- Quando perde il focus, in ogni caso andare a leggere il valore bindato (nel nostro caso la proprietà Codice dell'oggetto Prodotto). E' vero che potrebbe fare un "giro" inutile, perchè magari non ha mai ricevuto l'evento NotifyPropertyChanged e quindi il valore bindato non è cambiato, ma almeno viene sempre rispettato il contratto di binding che noi abbiamo dichiarativamente richiesto;
- In modo più efficente, il controllo potrebbe porre a true una proprietà bool NotifyPropertyChangedReceived, in cui mettere in stand by l'evento ricevuto, ed eseguire le operazioni di aggiornamento del binding quando il controllo perde il focus.
In ogni caso, rimane fermo un punto incontrovertibile: usando l'XAML, noi dichiariamo un binding two way, e così facendo non dovremmo occuparci di come WPF lo fa. Sono cavoli suoi. Il fatto che io usi una interfaccia grafica per così dire curiosa o strampalata, perchè faccio una formattazione del valore che si sta editando non significa nulla. Il Framework DEVE gestire anche questa modalità (o impedirla del tutto, se ve n'è motivo). Di fatto la mia applicazione dimostra che senza l'uso del workaround si finisce in uno stato in cui il campo mostra un valore che non è quello della proprietà bindata, quindi WPF non onora la nostra dichiarazione di binding two way.
E questo, parafrasando GhostBuster, è male!
-----------------------------------------------------------------------------
Egon: Mai incrociare i flussi!
Peter: Perché?
Egon: Sarebbe male.
Peter: Faccio sempre confusione tra il bene e il male, che intendi per male?
Egon: Immagina che la vita come tu la conosci si fermi istantaneamente e ogni molecola del tuo corpo esploda alla velocità della luce.
Ray: Inversione protonica totale!
Peter: E quello è male... Ok è un importante ragguaglio, grazie Egon!