2010-10-19 2 views
2

Excuses pour le long message - Lisez quelques discussions à ce sujet, mais toujours difficile à mettre en œuvre. Au fond, j'ai une collection d'objets, définis comme:WPF Treeview - Liaison à une collection avec différentes profondeurs, et le style différemment

public class LibData 
{ 
    public string Name { get; set; } 
    ObservableCollection<LibObject> _list; 
    public ObservableCollection<LibObject> List { get { return _list; } } 

    public LibData(string name, LibDataType type) 
    { 
     this.Name = name; 
     _list = new ObservableCollection<LibObject>(); 
    } 
} 

et l'objet:

public class LibObject 
{ 
    public string Name { get; set; } 

    public LibObject(string name) 
    { 
     this.Name = name; 
    } 
} 

Mon principal problème est dans le XAML, et le style de cette TreeView. J'ai besoin d'un style spécifique pour un élément "root" et d'un style spécifique pour un "leaf". La chose est, qu'un élément dans la liste liée est "Root-> Leaf", et un autre est "Root-> Child-> Leaf". Je essayé ceci:

<TreeView x:Name="myTree" ItemsSource="{x:Static local:myDataList}"> 
    <TreeView.ItemTemplate> 
     <HierarchicalDataTemplate ItemsSource="{Binding Path=List}" > 
      <Grid> 
       <StackPanel Orientation="Horizontal"> 
         <TextBlock Text="{Binding Path=Name}" /> 
         <CheckBox IsChecked="True" Content="HeaderCheckbox"/> 
       </StackPanel> 
      </Grid> 
     <HierarchicalDataTemplate.ItemTemplate > 
       <DataTemplate> 
        <Grid> 
      <StackPanel Orientation="Horizontal"> 
       <CheckBox IsChecked="True" Content="LeafCheckbox" /> 
       <TextBlock Text="{Binding Path=Name}"/> 
      </StackPanel> 
        </Grid> 
       </DataTemplate> 
      </HierarchicalDataTemplate.ItemTemplate> 
     </HierarchicalDataTemplate> 
    </TreeView.ItemTemplate> 

Cela fonctionne évidemment très bien pour le "Root-> Feuille" élément, mais pas pour le "Root-enfant-feuille". L'implémentation de XAML semble être plus une solution "codée en dur", où je sais que la mise en page de l'article est toujours "Root-> Leaf" - comment puis-je rendre cette dynamique? Encore une fois, j'ai vu des solutions à différents niveaux (y compris en utilisant des convertisseurs), mais le problème que j'ai est que j'ai besoin de styles spécifiques à la racine et la feuille et rien pour les niveaux intermédiaires. Je me demande si je regarde cela complètement faux ...

Répondre

6

Un moyen facile de le faire. Tirez les DataTemplates hors de TreeView et placez-les dans la section des ressources. Spécifiez la propriété DataType pour chaque DataTemplate, mais n'incluez pas de clé. Le ItemTemplateSelector (une propriété de type DataTemplateSelector) sur le TreeView fera la magie de l'utilisation de DataTemplate quel que soit le type d'élément correct.

Créez un HierarchicalDataTemplate pour les types Root et Child et un DataTemplate pour le type Leaf.

Quelque chose comme ceci:

<Window.Resources> 
    <ResourceDictionary> 

     <DataTemplate DataType="{x:Type local:Leaf}"> 
      <Grid> 
       <StackPanel Orientation="Horizontal"> 
        <CheckBox IsChecked="True" Content="LeafCheckbox" /> 
        <TextBlock Text="{Binding Path=SomeValue}"/> 
       </StackPanel> 
      </Grid> 
     </DataTemplate> 

     <HierarchicalDataTemplate DataType="{x:Type local:Child}" 
            ItemsSource="{Binding Children}"> 
      <StackPanel Orientation="Horizontal"> 
       <TextBlock Text="Child " /> 
       <TextBlock Text="{Binding Path=SomeValue}" /> 
      </StackPanel> 
     </HierarchicalDataTemplate> 

     <HierarchicalDataTemplate DataType="{x:Type local:Root}" 
            ItemsSource="{Binding Children}"> 
      <Grid> 
       <StackPanel Orientation="Horizontal"> 
        <TextBlock Text="Root " /> 
        <TextBlock Text="{Binding Path=SomeValue}" /> 
       </StackPanel> 
      </Grid> 
     </HierarchicalDataTemplate> 

    </ResourceDictionary> 
</Window.Resources> 

<Grid> 
    <TreeView x:Name="myTree" ItemsSource="{Binding}" /> 
</Grid> 
+0

La partie de prendre les modèles sur les ressources TreeView critiques? Je n'ai pas mentionné cela, mais j'utilise ceci dans un assistant, et chaque "fenêtre" est en fait un PageFunction - comme je l'ai compris, il n'y a aucune ressource pour cela. – user350213

+0

Oui, il est nécessaire de retirer les DataTemplates de TreeView. Vous voudriez le faire parce que vous ne voulez pas spécifier le ItemTemplate directement puisque dans ce cas les modèles devraient changer basé sur le type d'article. Dans mon exemple précipité, j'ai mis les DataTemplates dans le Window.Resources, mais cela pourrait aussi bien être le TreeView.Resources. – mbursill

+0

Oh, je comprends - donc le mettre dans une clause fera l'affaire. Cool. Je vais essayer. Merci. – user350213