2010-07-02 13 views
22

Non sto abbastanza facendo la differenza tra ItemsSource e DataContext. Qualcuno può spiegarlo e sostenerlo con degli esempi? Quando dovrei usare l'uno o l'altro.Differenza tra ItemsSource e DataContext come pertinente per ListBox

Sto leggendo i documenti e si dice che posso associare DataContext, ma lancio una ObservableCollection su di esso e non compare nulla nell'elenco. Se lancio la stessa collezione su ItemsSource, funziona perfettamente.

risposta

43

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.

+5

Grazie mille. Questa è la prima spiegazione comprensibile che ho trovato. – AngryHacker

+0

@AnthonyWJones Dannazione buona risposta, signore –

Problemi correlati