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