2009-02-26 15 views
0

Si j'ai un DataSet à la suite d'une requête SQL, puis-je le lier directement à un TreeView et montrer la hiérarchie de mes données? Je sais que je devrais utiliser plusieurs HierarchicalDataTemplates, mais je ne sais pas comment dire à chaque donnée à afficher.Comment lier un jeu de données directement à un TreeView (avec une hiérarchie)?

Si j'ai une hiérarchie à 4 niveaux, comme ceci:

<HierarchicalDataTemplate x:Key="FirstLevelTemplate" ItemTemplate="{StaticResource SecondLevelTemplate}"/> 
<HierarchicalDataTemplate x:Key="SecondLevelTemplate" ItemTemplate="{StaticResource ThirdLevelTemplate}"/> 
<HierarchicalDataTemplate x:Key="ThirdLevelTemplate" ItemTemplate="{StaticResource FourthLevelTemplate}"/> 
<DataTemplate x:Key="FourthLevelTemplate"/> 

Quels sont les biens (s) doivent être configurés pour afficher mes données directement à partir d'un DataSet?

edit: Idéalement, je voudrais le faire en utilisant un seul DataTable auto-référencé.

Répondre

1

Je ne pense pas que vous pouvez le faire.

Le contrôle Treeview et le HierarchicalDataTemplate attendent une hiérarchie d'objets. Le DataSet est intrinsèquement plat.

Vous devrez en quelque sorte convertir cet ensemble de données en une hiérarchie d'objets, chacun avec sa propre collection "Enfants". La ItemsSource de l'arborescence sera liée à la "collection de niveau supérieur" (les lignes sans référence parente).

Chaque propriété HierarchicalDataTemplate aura sa propriété ItemsSource liée à la propriété Children correspondante.

Il pourrait y avoir une solution en utilisant des convertisseurs, mais si elle existe, cela finirait probablement par être plus compliqué que de remodeler directement les données avant de les lier.

+0

J'ai fini par créer une hiérarchie de TreeViewItems par programme, et cela a semblé fonctionner (bien que ce ne soit probablement pas la pratique BEST). Merci! – Pwninstein

0

Tout d'abord, vous devez définir le ItemsSource de TreeView sur le DataSet.

Vous devez ensuite définir le ItemTemplate de TreeView sur FirstLevelTemplate.

ItemTemplate="{StaticResource FirstLevelTemplate}" 

Le premier modèle doit faire référence aux éléments qui utiliseront le deuxième modèle de niveau. Ajouter une source d'éléments à ce modèle hiérarchique comme ceci:

<HierarchicalDataTemplate x:Key="FirstLevelTemplate" ItemsSource="{Binding ChildItems}" ItemTemplate="{StaticResource SecondLevelTemplate}"/> 

Changer « ChildItems » de se référer à la propriété dans votre DataSet qui contient les éléments enfants. Répétez ceci pour chaque HierarchicalDataTemplate. Enfin, vous devez ajouter des contrôles à vos DataTemplates pour afficher les données. Voici un exemple simple:

<DataTemplate x:Key="FourthLevelTemplate"/> 
    <Border BorderThickness="1" BorderBrush="Gray" CornerRadius="3"> 
     <TextBlock Text="{Binding DataProperty}" 
       HorizontalAlignment="Center" VerticalAlignment="Center"/> 
    </Border> 
</DataTemplate> 

Dans ce cas, vous devez remplacer « DataProperty » avec le nom de la propriété de votre champ de données. Notez que vous pouvez ajouter d'autres contrôles (tels que TextBox, ComboBox, etc.) pour afficher des données supplémentaires.

+0

Y at-il un moyen de définir le modèle de contrôle des enfants de deuxième niveau? – Echilon

+0

Ma suggestion était de créer un HierarchicalDataTemplate pour chaque niveau. Le deuxième niveau s'appellerait quelque chose comme "SecondLevelTemplate". Les contrôles dans ce modèle seraient affichés pour le deuxième niveau. Si vous voulez un "ControlTemplate", utilisez Control dans le DataTemplate et définissez la propriété Template sur celui-ci. –

Questions connexes