[WPF] Feature o bug del framework? (II°parte)

Nella prima parte di questo post, abbiamo spiegato le premesse e le motivazioni.

Con questo secondo post vedremo come creare le relazioni di binding tra i campi della finestra WPF e le proprietà del prodotto, com'è fatta l'applicazione di prova e qual'è il comportamento anomalo del framework WPF, relativamente al binding two ways.

Per cercare di non annoiarvi ho pensato di realizzare un video con la dimostrazione:

Il video conviene vederlo in alta qualità su youtube (perchè purtroppo al momento non riesco a visualizzarlo su questa pagina, dove invece appare più piccolo e in qualità normale).

Per chi vuole andare direttamente al punto in cui descrivo il comportamento IMHO anomalo di WPF, saltate l'introduzione e andate direttamente al 3° minuto della presentazione.

Per chi invece vuole approfondire l'argomento, seguono acuni dettagli relativi all'applicazione.

Iniziamo con la creazione dell'oggetto "prodotto" (che è una istanza della classe Prodotto) fatta in modo dichiarativo, nel sorgente XAML della finestra WPF:

   1: <Window x:Class="TPCWare.WPF_Lab.Test1.Window1"
   2:     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   3:     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   4:     xmlns:cs="clr-namespace:TPCWare.WPF_Lab.Test1"
   5:     Title="WPF Lab - Binding Test n°1"
   6:     SizeToContent="WidthAndHeight">
   7:     <Window.Resources>
   8:         <cs:Prodotto x:Key="prodotto" Codice="25.123" Descrizione="Rosa chinensis"/>
   9:     </Window.Resources>

Nella riga 4 definiamo cs come XML namespace mappandolo al .NET namespace della nostra applicazione, mentre nelle righe 7, 8 e 9 creiamo un oggetto "prodotto" di tipo "Prodotto" nelle risorse della finestra WPF.

Proseguiamo illustrando le relazioni di binding, definite in modo dichiarativo sempre nel sorgente XAML della finestra WPF:

   1: <DockPanel Name="dockPanelProdotto" >
   2:     <Label Margin="4,8,2,4" Width="60">Codice</Label>
   3:     <TextBox Name="textBoxCodiceProdotto" Margin="0,8,0,4" Height="23" Width="70"
   4:              Text="{Binding Source={StaticResource prodotto}, Path=Codice,
   5:                             Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
   6:              LostFocus="textBoxCodiceProdotto_LostFocus" />
   7:     <Label Margin="4,8,4,4" >Descrizione</Label>
   8:     <TextBox Name="textBoxDescrizioneProdotto" Margin="0,8,4,4" Height="23"
   9:              Background="Gainsboro" IsEnabled="False"
  10:              Text="{Binding Source={StaticResource prodotto}, Path=Descrizione,
  11:                             Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" />
  12: </DockPanel>

Nelle righe 3, 4 e 5 definiamo il binding della proprietà "Text" del TextBox "textBoxCodiceProdotto" con la proprietà "Codice" ( Path=Codice ) dell'oggetto "prodotto" ( Source={StaticResource prodotto} ) in modalità TwoWay ( Mode= TwoWay ) e con sicronizzazione attivata da ogni modifica del valore della proprietà "Text", oltre che dall'evento NotifyPropertyChanged emesso dall'oggetto "prodotto".

Nella riga 6 definiamo l'evento LostFocus di cui riportiamo il sorgente, contenuto nel file C# associato alla finestra WPF:

   1: private void textBoxCodiceProdotto_LostFocus(object sender, RoutedEventArgs e)
   2: {
   3:     CheckBox checkBoxWorkaround = (CheckBox)this.FindName("checkBoxWorkaround");
   4:     if (checkBoxWorkaround.IsChecked == true)
   5:     {
   6:         Prodotto prodotto = this.Resources["prodotto"] as Prodotto;
   7:         if (prodotto != null)
   8:         {
   9:             prodotto.Codice = prodotto.Codice;
  10:         }
  11:     }
  12: }

Come si può notare nella riga 4, il workaround contenuto nell'evento LostFocus viene eseguito solo se nella finestra WPF è stato selezionato il relativo box di spunta.

Chi desidera può scaricare il file .zip contenente la solution e il file .mp4 della demo.

posted @ lunedì 10 novembre 2008 0.59

Print

Comments on this entry:

# re: [WPF] Feature o bug del framework? (II°parte)

Left by Alessandro Scardova at 10/11/2008 10.00
Gravatar
Piero Angela... UGUALE :-D

# re: [WPF] Feature o bug del framework? (II°parte)

Left by Nicolò Carandini at 10/11/2008 11.01
Gravatar
ehhh, hai ragione. E' la mia prima demo, sono un po' ingessato. A parte l'impostazione della voce, che ne pensi del comportamento di WPF?

# re: [WPF] Feature o bug del framework? (II°parte)

Left by LudovicoVan at 10/11/2008 16.48
Gravatar
Personalmente lo trovo abbastanza "naturale": da una parte, considera che il two-way databinding comunque copia da source a target o viceversa, ma non puo' fare round-trip completi altrimenti si rischia il loop infinito; inoltre il tuo caso non e' un caso "base" perche' fra il tuo target e il tuo source c'e' una trasformazione, per giunta "asimmetrica" (cioe' vale in un verso solo).

In uno scenario di produzione reale, io il campo della form semplicemente non lo sovrascriverei con il valore trasformato, cioe' terrei le due cose -- codice abbreviato e codice esteso -- distinte. Anche perche' al primo inserimento dai all'utente la possibilita' di inserire codici abbreviati, ma poi se gli va di cambiare il valore del codice si trova ad editare il codice esteso.

Insomma, tecnicamente parlando (e IMHO), l'anomalia direi che e' piuttosto nella logica di funzionamento che hai implementato che non e' "lineare".

BTW, complimenti, come prima demo davvero niente male. Semmai la qualita' video lasciava un po' a desiderare.

-LV

# re: [WPF] Feature o bug del framework? (II°parte)

Left by Nicolò Carandini at 11/11/2008 9.27
Gravatar
@Ludovico: grazie per il commento, infatti è per questo che ho intitolato il post "feature o bug", proprio perchè pur non condividendo la scelta progettuale fatta dalla microsoft, non posso certo dire che si tratta di un bug.
Per il video: l'ho renderizzato a 640 x 480 senza pensare che sarebbe poi stato visto a 400x 300. Ora ci lavoro su e provo a migliorarlo.

# re: [WPF] Feature o bug del framework? (II°parte)

Left by LudovicoVan at 11/11/2008 11.33
Gravatar
OK, non condividere una scelta progettuale e' piu' che legittimo, ma, a parte che non qui si tratti di Microsoft in particolare, quale altro comportamento ti saresti aspettato/avresti implementato?

Non ti chiedo di rispondermi perche' la risposta non si puo' confezionare in pochi minuti: quello che intendo e' che, se mai avrai voglia e tempo di provare a implementare tu un motore di binding (anche "piccolo", a fini sperimentali), ti troverai anche tu a confronto con scelte simili, e a quel punto potrai dire non solo cosa non ti piace, ma anche cosa e come lo avresti fatto diverso.

E a quel punto -- potrei sbagliarmi, ma lo dico giusto a riassumere la mia tesi -- penso che non potrai che concludere che la strada scelta da MS, che poi e' una strada assolutamente convenzionale, e' piu' che ragionevole se non l'unico approccio tecnicamente possibile/sensato.

-LV

# re: [WPF] Feature o bug del framework? (II°parte)

Left by Nicolò Carandini at 12/11/2008 13.15
Gravatar
Naaaa! ho postato al riguardo. Continuo a ringraziarti per i tuoi commenti, che sono molto graditi, ma non condivido. La soluzione è semplice e facilmente implementabile da MS. Rimane il fatto che hai invece pienamente ragione sull'altro punto: implementare un motore di binding è tutt'altro che facile, e io non ne sarei assolutamente capace. Ma una volta fatto il grosso del lavoro, anche persone molto più a basso livello, come me, possono dare magari un piccolo contributo, con una piccola idea.

# re: [WPF] Feature o bug del framework? (II°parte)

Left by LudovicoVan at 12/11/2008 21.00
Gravatar
Yep, una cosa e' certa: questa e' una professione dove non si finisce mai di imparare -- sara' per questo che non ci stanca mai!! --, e assolutamente non intendevo sminuire le tue riflessioni. Mi sono messo a "disquisire" piu' che altro perche' nelle ultime settimane mi sto cimentando con Silverlight, quindi l'argomento mi trova particolarmente sensibile.

Keep up the good work e alla prossima!

-LV

# re: [WPF] Feature o bug del framework? (II°parte)

Left by Nicolò Carandini at 12/11/2008 21.24
Gravatar
@Ludovico (che poi sarebbe Julio): non hai minimamente sminuito le mie riflessioni, anzi, mi hai stimolato a fare un apposito post! Sono io che ci tengo a stare al mio posto, che è quello di uno che ne sa proprio poco poco (e non lo dico per falsa modestia ma per buona conoscenza dei miei limiti) io sono felice di stare in UGIdotNet e ancora più felice che persone come te (ho letto molti tuoi post e commenti che condivido in pieno) "disquisiscano" su temi che affronto nei miei post, perchè vuol dire che per un verso o l'altro li trovi interessanti.
Piuttosto, tornando sul tema, ti piace la mia soluzione? La proponiamo a Mamma Microsoft? ;-)

# re: [WPF] Feature o bug del framework? (II°parte)

Left by LudovicoVan at 13/11/2008 2.38
Gravatar
Quale soluzione? :)

-LV

# re: [WPF] Feature o bug del framework? (II°parte)

Left by Nicolò Carandini at 13/11/2008 8.19
Gravatar
Quella che ho postato nella III° parte (blogs.ugidotnet.org/.../94622.aspx). Sei rimasto indietro di una puntata! :-D
Comments have been closed on this topic.