Ogni Content, Text e Panel Control espone la proprietà DataContext
, che permette di contenere la fonte dati e stabilire se sia visibile oppure no.
Riprendiamo il frammento di codice XAML della scorsa lezione:
<StackPanel x:Name="LayoutRoot"> <TextBlock Text="{Binding Name}" /> <Button Content="{Binding CurrentDriver}" /> </StackPanel>
Quando un controllo figlio, come in questo caso, non ha impostato un DataContext
, lo eredita dal padre. Ecco perché nell'esempio impostiamo il DataContext
dello StackPanel
.
LayoutRoot.DataContext = Team.GetAll().First();
Eseguiamo l'applicazione ed il risultato sarà simile al seguente:
Se vogliamo visualizzare una collezione di elementi dobbiamo utilizzare un ItemsControl, per esempio possiamo visualizzare la lista dei Team
in un controllo ListBox
. Per farlo dobbiamo impostare la proprietà ItemSource
esposta da tutti gli ItemsControl
. In fase di rendering il comportamento predefinito prevede che se non viene definito come visualizzare un oggetto contenuto nella lista verrà utilizzato il valore restituito dal metodo ToString
. Diversamente possiamo indicare quale proprietà visualizzare tramite la proprietà DisplayMemberPath
.
<StackPanel x:Name="LayoutRoot"> <ListBox Margin="10" ItemsSource="{Binding}" DisplayMemberPath="Name" /> </StackPanel>
In questo caso utilizziamo il Markup Extension senza parametri, per indicare al motore di Binding che siamo interessati a tutta la fonte dati, ovvero il DataContext
. Dopodiché modifichiamo anche il code-behind in modo che carichi l'intera lista di Team
.
private List<Team> teams; public Page() { InitializeComponent(); teams = Team.GetAll(); LayoutRoot.DataContext = teams; }
Il risultato sarà il seguente: