I controlli (incluso il ListBox) non fanno nulla con il valore di DataContext
. Il suo scopo è fornire un contesto per i dati associazioni.
Supponiamo di avere una "lista personale" ListBox
e un "myData" MyData
. Il tipo MyData
ha una proprietà "Persone" di tipo ObservableCollection<Person>
ea sua volta il tipo Person
ha le proprietà stringa "Nome" e "Cognome".
Tutti i seguenti sono equivalenti: -
myList.ItemsSource = myData.People;
o
myList.DataContext = myData;
myList.SetBinding(ItemsControl.ItemsSourceProperty, new Binding("People"));
o
myList.DataContext = myData.People;
myList.SetBinding(ItemsControl.ItemsSourceProperty, new Binding());
In genere se attacchi sono configurati in XAML e il DataContext del LayoutRoot è assegnato l'oggetto dati: -
LayoutRoot.DataContext = myData;
si potrebbe avere la seguente Xaml: -
<Grid x:Name="LayoutRoot">
<ListBox x:Name="myList" ItemsSource="{Binding People}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Forename}" Margin="2" />
<TextBlock Text="{Binding Surname}" Margin="2" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
Avrete notato un paio di cose qui. Il DataContext
di "myList" non è stato assegnato affatto. In questo caso l'albero genealogico del controllo viene calpestato finché non viene trovato un antenato che ha un valore assegnato alla proprietà DataContext
.
Inoltre, ogni ListBoxItem
generato dinamicamente per ogni Person
esempio ha che Person
istanza assegnato come DataContext
che è come gli attacchi nome e cognome riescono a lavorare.
Grazie mille. Questa è la prima spiegazione comprensibile che ho trovato. – AngryHacker
@AnthonyWJones Dannazione buona risposta, signore –