2011-11-08 2 views
3

J'essaye de construire un TreeView dans WPF qui a des catégories.Databind WPF TreeView avec types mixtes et Sub-TreeViewItems catégorisés

Fondamentalement, la structure ressemble à ceci:

Root 
|_ 
| Cat A 
|_ 
| Cat B 
|_ 
    Cat C 

Chaque catégorie est lié à une collection observable séparée. La plupart de mes catégories sont très simples. Le TreeViewItem qui est la catégorie a son ensemble ItemsSource et il n'y a pas de hiérarchie. Cependant, j'ai une catégorie qui doit être représentée dans une hiérarchie spéciale.

image que « Cat C » dans l'arbre ci-dessus devient alors comme ceci:

Servers 
    |_ 
    | [SERVER A's DISPLAY NAME] 
    | |_ 
    | | Namespaces 
    | | |_ 
    | |_ [NAMESPACE alpha's DISPLAY NAME] 
    | | Deployments 
    | | |_ 
    | |_ [DEPLOYMENT 1's DISPLAY NAME] 
    |_ Configuration File 
    [SERVER B's DISPLAY NAME] 

Fondamentalement, ce que je veux est le TreeViewItem parent codé en dur d'avoir une tête statique. Cet article devrait alors avoir une collection d'articles avec leurs noms montrés. Pour chaque enfant du parent d'origine, il devrait y avoir trois éléments statiques qui ont une liste dynamique d'enfants. En écrivant ceci, je pense que cela devrait être un problème très simple à résoudre. Cependant, après avoir joué avec le XAML pendant quelques jours, je ne peux pas obtenir une hiérarchie pour fonctionner. Voici le plus loin que j'ai pu obtenir. J'ai utilisé une collection composite appelée Children pour obtenir les espaces de noms, les déploiements et le fichier de configuration dans une collection. Cependant, je ne peux pas les séparer.

<TreeViewItem ItemsSource="{Binding Path=Configuration.Servers}" 
         IsExpanded="True" > 
      <TreeViewItem.ItemContainerStyle> 
       <Style TargetType="{x:Type TreeViewItem}" BasedOn="{StaticResource {x:Type TreeViewItem}}"> 
        <Setter Property="IsExpanded" Value="True"/> 
       </Style> 
      </TreeViewItem.ItemContainerStyle> 

      <TreeViewItem.HeaderTemplate> 
       <DataTemplate> 
        <Border Margin="0,2,2,0"> 
         <StackPanel Orientation="Horizontal"> 
          <Image Source="/WPF;component/Images/server_chart.png" 
            Margin="0,0,5,0"/> 
          <TextBlock Text="Cognos Servers" /> 
         </StackPanel> 
        </Border> 
       </DataTemplate> 
      </TreeViewItem.HeaderTemplate> 

      <TreeViewItem.Resources> 
       <HierarchicalDataTemplate ItemSource="{Binding Path=Children}" DataType="{x:Type local:Server}"> 
        <HierarchicalDataTemplate.ItemContainerStyle> 
         <Style TargetType="{x:Type TreeViewItem}" BasedOn="{StaticResource {x:Type TreeViewItem}}" > 
          <Setter Property="IsExpanded" Value="True"/> 
         </Style> 
        </HierarchicalDataTemplate.ItemContainerStyle> 
        <TextBlock Text="{Binding DisplayName}" PreviewMouseRightButtonDown="OnPreviewMouseRightButtonDown"> 
         <TextBlock.ContextMenu> 
          <ContextMenu> 
           <MenuItem Header="Refresh" Click="TreeItemMenu_AddNewClient"> 
            <MenuItem.Icon> 
             <Image Source="/WPF;component/Images/arrow_refresh.png" /> 
            </MenuItem.Icon> 
           </MenuItem> 
           <MenuItem Header="Add Client..." Click="TreeItemMenu_AddNewClient" /> 
           <Separator /> 
           <MenuItem Header="Remove" Click="TreeItemMenu_RemoveClick"> 
            <MenuItem.Icon> 
             <Image Source="/WPF;component/Images/server_delete.png" /> 
            </MenuItem.Icon> 
           </MenuItem> 
          </ContextMenu> 
         </TextBlock.ContextMenu> 
        </TextBlock> 
       </HierarchicalDataTemplate> 

       <HierarchicalDataTemplate ItemsSource="{Binding Clients}" DataType="{x:Type local:Namespace}"> 
        <HierarchicalDataTemplate.ItemContainerStyle> 
         <Style TargetType="{x:Type TreeViewItem}" BasedOn="{StaticResource {x:Type TreeViewItem}}" > 
          <Setter Property="IsExpanded" Value="True"/> 
         </Style> 
        </HierarchicalDataTemplate.ItemContainerStyle> 
        <TextBlock Text="{Binding DisplayName}" PreviewMouseRightButtonDown="OnPreviewMouseRightButtonDown" /> 
       </HierarchicalDataTemplate> 

       <DataTemplate DataType="{x:Type local:Client}"> 
        <TextBlock Text="{Binding DisplayName}" 
           ContextMenu="{StaticResource ResourceKey=ContextMenuTreeItem}" 
           PreviewMouseRightButtonDown="OnPreviewMouseRightButtonDown" /> 
       </DataTemplate> 
      </TreeViewItem.Resources> 

Répondre

3

Mike,

mélange des données statiques et modèle sera probablement pas vous rendre où vous voulez. Vous devrez créer un ViewModel réel qui contient les nœuds statiques, etc. Je recommande fortement Josh Smith's TreeView ViewModel tutorials. C'est le premier, mais regardez autour pour plus d'informations. Il est l'un des développeurs les plus compétents sur ce sujet. Nous avons eu beaucoup de succès suite à ses recommandations.

+0

Votre réponse est correcte. Je suppose que je pourrais dire que j'étais à mi-chemin. J'ai résisté à la création d'un ViewModel pour les titres catégorisés. Après avoir créé un modèle générique pour représenter une rubrique catégorisée, cela a mieux fonctionné. Toujours pas aussi propre que j'aime, mais ça marche maintenant. –