2017-10-10 3 views
0

Donc, fondamentalement, j'ai une liste d'un objet qui contient une autre liste d'objets. Disons que j'ai une liste de l'objet Class. Et Class contient une liste de Students. Chaque étudiant a une propriété Name en tant que chaîne simple.Liaison de données complexes à un ItemsControl

Donc, fondamentalement, ce que je veux est le suivant: L'utilisateur peut sélectionner une classe en utilisant un ComboBox.

<ComboBox ItemsSource="{Binding Path=Classes}" DisplayMemberPath="Name" /> 

Cela fonctionne.

Après avoir sélectionné un élément de cette zone de liste déroulante, l'utilisateur devrait voir une liste de tous les élèves de cette classe (rappelez-vous la propriété Name dans Students)

J'ai créé simple ItemsControl à cette fin. Ma question est: Comment puis-je avoir accès au nom des étudiants sur mon étiquette?

Répondre

1

Votre modèle de vue devrait avoir une propriété SelectedClass, qui serait mis à jour en se liant à SelectedItem propriété du ComboBox:

<ComboBox ItemsSource="{Binding Classes}" 
      SelectedItem="{Binding SelectedClass}" .../> 

alors vous lier ItemsControl à la collection Students de la classe sélectionnée comme ceci:

<ItemsControl ItemsSource="{Binding SelectedClass.Students}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Name}"/> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

Notez que le modèle de vue doit implémenter l'interface INotifyPropertyChanged et déclenche l'événement PropertyChanged lors SelectedClass changements.


Dans une approche rapide et sale, sans propriété modèle de vue SelectedClass, vous pouvez également accéder directement SelectedItem du ComboBox comme ceci:

<ComboBox x:Name="cbClasses" ItemsSource="{Binding Classes}" ... /> 

<ItemsControl ItemsSource="{Binding SelectedItem.Students, ElementName=cbClasses}"> 
...