2008-12-09 7 views
1

J'ai certaines données qui ont une table de détail. Je veux que les données soient présentées dans un ListView. Je souhaite que les données détaillées apparaissent sous la forme d'un ListView imbriqué lorsque vous sélectionnez un élément dans la liste d'origine. Je n'arrive pas à comprendre comment faire fonctionner la liaison de données.Liaison de données hiérarchique avec ListViews imbriqués dans WPF

Voici ce que j'ai jusqu'à présent, (le problème est le {Binding Path=FK_History_HistoryItems}):

<ListView Name="lstHistory" ItemsSource="{Binding Source={StaticResource History}}" SelectionChanged="lstHistory_SelectionChanged"> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn DisplayMemberBinding="{Binding Path=Name}" Header="Name" Width="100" /> 
      <GridViewColumn DisplayMemberBinding="{Binding Path=Description}" Header="Description" Width="150" /> 
      <GridViewColumn DisplayMemberBinding="{Binding Path=Total, Converter={StaticResource moneyConvert}}" Header="Total" Width="100" /> 
      <GridViewColumn DisplayMemberBinding="{Binding Converter={StaticResource categoryAggregate}}" Header="Categories" Width="100" /> 
     </GridView> 
    </ListView.View> 
    <ListView.Resources> 
     <Style TargetType="{x:Type ListViewItem}"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type ListViewItem}"> 
         <Border> 
          <StackPanel> 
           <Border Name="presenter" 
             Background="{TemplateBinding Background}" 
             BorderBrush="{TemplateBinding BorderBrush}" 
             BorderThickness="{TemplateBinding BorderThickness}" 
             Padding="{TemplateBinding Padding}"> 
            <GridViewRowPresenter /> 
           </Border> 
           <Border Name="details" Visibility="Collapsed" Margin="5" 
             BorderBrush="Black" BorderThickness="2"> 
            <StackPanel Margin="5"> 
             <ListView ItemsSource="{Binding Path=FK_History_HistoryItems}"> 
              <ListView.View> 
               <GridView> 
                <GridViewColumn DisplayMemberBinding="{Binding Path=Ammount}" Header="Ammount" Width="100" /> 
                <GridViewColumn DisplayMemberBinding="{Binding Path=Category}" Header="Category" Width="100" /> 
               </GridView> 
              </ListView.View> 
             </ListView> 
            </StackPanel> 
           </Border> 
          </StackPanel> 
         </Border> 
         <ControlTemplate.Triggers> 
          <Trigger Property="IsSelected" Value="True"> 
           <Setter TargetName="details" Property="Visibility" Value="Visible" /> 
           <Setter TargetName="presenter" Property="Background" Value="Navy"/> 
           <Setter TargetName="presenter" Property="TextElement.Foreground" Value="White" /> 
          </Trigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </ListView.Resources> 
</ListView> 
+0

Quelle sortie obtenez-vous de la liaison ne fonctionne pas? (Et juste pour que vous sachiez, "Montant" a un "m" ...) – Donnelle

+0

Cela fonctionne pour moi avec la même configuration de données que http://stackoverflow.com/questions/350214/wpf-use-a- listbox-in-a-template-that-sera-le-template-of-another-listbox. Quelles sont les données et les sources que vous utilisez? – Donnelle

+0

Compact SQL Server 2008 avec une table Historique et sa table de détail HistoryItems avec une relation FK appelée FK_History_HistoryItems. Cela fonctionnerait avec un TreeView et un HierarcicalDataTemplate, mais cela ne semble pas fonctionner ici. –

Répondre

1

Si je comprends bien votre question, vous devez lier à la SelectedItem de la liste originale:

<ListView ItemsSource="{Binding ElementName=lstHistory, Path=SelectedItem}"> 

Ensuite, définissez le datatemplate/view selon vos besoins. Si vous ne voulez pas utiliser ElementName pour la liaison, vous pouvez également utiliser RelativeSource, mais je trouve ElementName plus facile à lire et à comprendre.

+0

Je ne pense pas que ce soit tout à fait ce dont j'ai besoin. J'ai besoin de lier à la table liée sur le FK sélectionné de la première table. En fait, la deuxième vue de liste est à l'intérieur du SelectedItem de lstHistory, donc je ne vois pas comment cela fait beaucoup. –

0

Vous devez changer votre ligne de problème à ce qui suit:

<ListView ItemsSource="{Binding FK_History_HistoryItems}"> 

Avec ce changement, le contrôle fonctionne à merveille. J'ai travaillé sur quelque chose de similaire en vain. J'aime vraiment ton travail à ce sujet.

0

Afin d'obtenir le déclenchement du travail, vous devez définir le ControlTemplate TargetType:

<ControlTemplate TargetType="{x:Type ListViewItem}"> 

Sans TargetType étant précisé (comme un type sélectionnable), le rendu XAML sera confus ...

Questions connexes