[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 02:59

Print
Comments have been closed on this topic.
«ottobre»
domlunmarmergiovensab
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456