2009-11-16 11 views
1

J'écris actuellement un WPF TreeListView. Je me demandais quelques choses.Structure de données hiérarchique WPF TreeListView

Comment fonctionne la structure de données hiérarchique et les enfants peuvent-ils afficher d'autres propriétés au lieu de la même propriété que le parent? Actuellement, je suis en train de faire une treelistview avec les colonnes

Client/Matière/Heures

Si j'ajouter un client et il a la même question alors le parent va changer son heure au total des heures à la nombre total d'heures additionnées par les enfants.

Voici un exemple

ajouter

John/papier d'écriture/1 heure
John/papier d'écriture/2 heures
John/papier à lettres/.5 Heures

Mon arbre l'affichage de la liste montrera

John/Papier d'écriture /3.5 heures < c'est le parent
-John/Papier d'écriture/1 heure
-John/papier d'écriture/2 heures
-John/papier à lettres/.5 Heures < ce sont les enfants

je voudrais lieu que pour montrer

John/papier à lettres/3.5 Heures
- 00 heures 00-à-01h00 h/écrit l'introduction
- 14h00-16h00/écrit le corps
- 15h00 - 3 : 30 h/a écrit la conclusion

J'utilise deux collections observables. Un qui est le parent et un qui est l'enfant.

Ma question est essentiellement. Puis-je modifier la structure de données hiérarchique pour afficher différentes propriétés? Différentes informations Je ne veux pas être répétitif en montrant les mêmes heures de client. Au lieu de cela, je voudrais montrer des propriétés différentes pour l'enfant. Puisque le parent montrera à qui l'information appartient. Btw, j'essaie de le faire pour XAML et C#

Merci à l'avance !!
-Kevin

Répondre

1

Vous pouvez définir DataTrigger pour HierarchicalDataTemplate et avoir une liaison de propriété différente. Juste un exemple ci-dessous.Please check this earlier answer in this thread just in case you need more ideas.

<HierarchicalDataTemplate DataType="{x:Type local:Person}" ItemsSource="{Binding People}" > 
    <Grid> 
     <TextBlock x:Name="fName" Text="{Binding FirstName}"/> 
     <TextBlock x:Name="lName" Text="{Binding LastName}" Visibility="Collapsed"/> 
    </Grid> 
    <HierarchicalDataTemplate.Triggers> 
    <DataTrigger Binding="{Binding State}" Value="A"> 
     <Setter TargetName="fName" Property="Visibility" Value="Collapsed"/> 
     <Setter TargetName="lName" Property="Visibility" Value="Visible"/> 
    </DataTrigger> 
    </HierarchicalDataTemplate.Triggers> 
</HierarchicalDataTemplate> 

Jobi Joy

+0

Cela ne fonctionnera pas, car Hiérarchique DataTemplate accepte uniquement sur enfant droit? – Kevin

+0

Oops a mis une grille autour d'elle .. –

1

Si votre parent et l'enfant sont différents types d'objets, il y a une réponse très simple: Il suffit d'utiliser HierarchicalDataTemplates multiples dans un ResourceDictionary:

<TreeView ItemsSource="{Binding Parents}"> 

    <TreeView.ResourceDictionary> 

    <HierarchicalDataTemplate 
     TargetType="{x:Type my:ParentType}" 
     ItemsSource="{Binding Children}"> 

     ... parent content ... 

    </HierarchicalDataTemplate> 

    <HierarchicalDataTemplate 
     TargetType="{x:Type my:ChildType}" 
     ItemsSource="{Binding Children}"> 

     ... child content ... 

    </HierarchicalDataTemplate> 

    </TreeView.ResourceDictionary> 
</TreeView> 

Cette technique ne fonctionne pas dans tous les scénarios, mais quand c'est le cas, c'est très puissant et expressif.

Une autre variante de ce si le parent et l'enfant sont du même type mais avec un autre paramètre est de créer un ItemTemplateSelector qui appelle LoadResource() pour charger le nom approprié HierarchicalDataTemplate en fonction des valeurs de données.