2010-07-02 5 views
22

Je ne suis pas tout à fait la différence entre ItemsSource et DataContext. Quelqu'un peut-il l'expliquer et le soutenir avec des exemples? Quand devrais-je utiliser l'un ou l'autre. Je lis les docs et dit que je peux lier en utilisant DataContext, mais je lui lance une ObservableCollection et rien n'apparaît dans la liste. Si je lance la même collection à ItemsSource, cela fonctionne très bien.Différence entre ItemsSource et DataContext en ce qui concerne ListBox

Répondre

43

Les contrôles (y compris le contrôle ListBox) ne font rien du tout avec la valeur de DataContext. Son but est de fournir un contexte pour les données liaisons. Supposons que vous avez un ListBox "myList" et un MyData "myData". Le type MyData a une propriété "Personnes" de type ObservableCollection<Person> et le type Person a les propriétés de chaîne "Prénom" et "Nom".

Toutes les mesures suivantes sont équivalentes: -

myList.ItemsSource = myData.People; 

ou

myList.DataContext = myData; 
myList.SetBinding(ItemsControl.ItemsSourceProperty, new Binding("People")); 

ou

myList.DataContext = myData.People; 
myList.SetBinding(ItemsControl.ItemsSourceProperty, new Binding()); 

Typiquement, si les liaisons sont configurés en Xaml et le DataContext du LayoutRoot est affectée l'objet de données: -

LayoutRoot.DataContext = myData; 

vous pourriez avoir le XAML suivant: -

<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> 

Vous remarquerez deux choses ici. Le DataContext de "myList" n'est pas affecté du tout. Dans ce cas, l'arborescence des ancres du contrôle est parcourue jusqu'à ce qu'un ancêtre ayant une valeur affectée à la propriété DataContext soit détecté.

De plus, chaque ListBoxItem généré dynamiquement pour chaque instance a Person que Person instance affecté en tant que son DataContext qui est de savoir comment les liaisons prénom et le nom parviennent à travailler.

+5

Merci beaucoup. C'est la première explication compréhensible que j'ai trouvée. – AngryHacker

+0

@AnthonyWJones Merde bonne réponse monsieur –