Il Data Binding è quel meccanismo che consente di associare e sincronizzare una fonte dati agli elementi dell'interfaccia utente. In fase di design, grazie a XAML, possiamo descrivere in maniera dichiarativa le relazioni di Binding senza preoccuparci di collegare la fonte dati.
Chiariamo questi concetti con un esempio: supponiamo di avere il seguente oggetto da visualizzare.
public class Team { public string Name{ get; set; } public string CurrentDriver { get; set; } public static List<Team> GetAll() { return new List<Team> { new Team { Name = "Citroen Total World Rally Team", CurrentDriver = "Sebastian Loeb" }, new Team { Name = "BP Ford Abu Dhabi World Rally Team", CurrentDriver = "Mikko Hirvonen" } }; } }
La classe oltre alle semplici proprietà contiene un metodo statico che restituisce un insieme di istanze predefinite di Team
. Per collegare la fonte dati con le proprietà dei controlli utilizziamo il Markup Extension Binding
, al quale possiamo passare una serie di parametri come il nome della proprietà da collegare e una modalità di Binding, tra quelle descritte nella seguente tabella:
Modalità | Descrizione |
---|---|
OneWay | La sincronizzazione dei dati si propaga solo dalla sorgente verso l'interfaccia utente |
OneTime | La sincronizzazione dei dati si propaga solo dalla sorgente verso l'interfaccia utente e solo la prima volta |
TwoWay | La sincronizzazione dei dati si propaga in entrambe le direzioni |
Procediamo dichiarando in XAML una serie di controlli collegati alle proprietà di un singolo oggetto Team
.
<StackPanel x:Name="LayoutRoot"> <TextBlock Text="{Binding Name}" /> <Button Content="{Binding CurrentDriver}" /> </StackPanel>
La definizione dell'interfaccia non ha richiesto nessun tipo di collegamento con i dati. L'unico limite nell'attuale architettura di Binding di Silverlight da tenere di conto è che la destinazione deve essere una DependencyProperty
.
Prima di eseguire l'applicazione dobbiamo dare "in pasto" al motore di Binding un'istanza della classe Team
. Per farlo dobbiamo impostare, nel code-behind, tale istanza come valore della proprietà DataContext
del controllo StackPanel
.
public Page() { InitializeComponent(); LayoutRoot.DataContext = Team.GetAll().First(); }