2009-07-10 10 views
1

J'ai un objet Client qui a une liste d'ordres. Maintenant, en utilisant le modèle MVVM, j'affiche une liste de clients qui fait partie de CustomerOrderViewModel et de "CustomerOrderView". Les clients sont présentés en listbox comme mis en œuvre ci-dessous:MVVM WPF Création d'éléments enfants

<ListBox BorderThickness="0" Grid.Column="0" Grid.Row="0" ItemsSource="{Binding Path=Customers}">     
       <ListBox.ItemTemplate> 
        <DataTemplate> 
         <StackPanel> 
         <view:CustomerView />     
         </StackPanel> 
        </DataTemplate> 
       </ListBox.ItemTemplate>     
      </ListBox> 

Maintenant je dois aussi afficher les commandes mais je dois l'afficher en dehors de la zone de liste. Comme ceci:

<StackPanel Grid.Column="1" Grid.Row="0" Margin="10"> 

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

      </StackPanel> 

Cela ne fonctionne pas parce qu'il n'y a pas de propriété sur CustomerOrderViewModel pour les commandes. Les commandes est une collection sur l'objet Client. Comment puis-je y arriver?

Voici l'exemple mis à jour:

<ListBox BorderThickness="0" Grid.Column="0" Grid.Row="0" ItemsSource="{Binding Path=Customers}">     
       <ListBox.ItemTemplate> 
        <DataTemplate> 
         <StackPanel Orientation="Horizontal"> 
         <view:CustomerView /> 

          <StackPanel Margin="20"> 

           <ItemsControl ItemsSource="{Binding Path=Orders}"> 
            <ItemsControl.ItemTemplate> 
             <DataTemplate> 
              <view:OrderView /> 
             </DataTemplate> 
            </ItemsControl.ItemTemplate> 
           </ItemsControl> 

          </StackPanel> 

         </StackPanel> 
        </DataTemplate> 
       </ListBox.ItemTemplate>     
      </ListBox> 

Je ne veux pas afficher les commandes de tous les clients. Je veux juste afficher la commande du client actuellement sélectionné.

Répondre

1

Vous pouvez utiliser une liaison master-detail.

+0

J'ai mis à jour le poste. Une chose que je suis concerné est pourquoi est-ce que je dois utiliser un ContentControl pourquoi je ne peux pas simplement utiliser un contrôle simple pour afficher toutes les informations. – azamsharp

+0

Toujours dans le lien ci-dessus, la personne utilise la StaticResource. J'utilise la liste personnalisée imbriquée et la liste . L'objet client a une collection de commandes. – azamsharp

+0

Je pense que je l'ai compris. J'ai dû utiliser le Binding ElementName et le ElementName appartenait au contrôle ListBox. – azamsharp

0

Je vous suggère d'ajouter une liste supplémentaire à votre fenêtre et de lier son DataContext au client actuellement sélectionné dans votre ListBox. Ce sera quelque chose comme ça:

 <ListBox BorderThickness="0" Grid.Column="0" Grid.Row="0" 
      ItemsSource="{Binding Path=Customers}" 
      x:Name="CustomerList"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <view:CustomerView /> 
       </DataTemplate> 
      </ListBox.ItemTemplate>     
     </ListBox> 

     <ListBox Grid.Column="1" Grid.Row="0" DataContext="{Binding ElementName=CustomersList, Path=SelectedItem}"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <view:Order DataContext="{Binding Path=Orders}" /> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 
Questions connexes