2010-10-15 4 views
0

J'ai un TreeView dans WPF que j'ai lié à une collection de catégories qui elle-même contient une collection de catégories et fils sur et ainsi de suite. Actuellement, je lie la collection avec succès et affiche tous les noms de mes catégories. Cependant, j'ai également une propriété IsExpanded sur mes objets de collection qui, quand tout est défini sur true, ne développe que le premier TreeViewItem mais pas les suivants.Comment développer les noeuds TreeViewItem liés et stylisés

Est-ce que quelqu'un sait ce qui ne va pas avec mes styles TreeView?

<HierarchicalDataTemplate x:Key="menuHierarchicalTemplate" ItemsSource="{Binding Path=SubCategories, Mode=TwoWay}" >   
     <Border x:Name="treeViewItemBorder" 
       CornerRadius="3" 
       MinWidth="125" 
       BorderBrush="Silver" Background="Transparent"> 
       <StackPanel Orientation="Horizontal" > 
        <TextBlock Height="24" Padding="5" Text="{Binding Path=Name}" /> 
       </StackPanel> 
      </Border> 
</HierarchicalDataTemplate> 

<Style x:Key="treeViewItemStyle" TargetType="TreeViewItem"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="TreeViewItem"> 
        <TreeViewItem IsExpanded="{Binding Path=IsExpanded, Mode=TwoWay}" 
            ItemsSource="{Binding Path=SubCategories}" 
            ItemTemplate="{StaticResource menuHierarchicalTemplate}" >        
         <TreeViewItem.Header>         
          <StackPanel Orientation="Horizontal" > 
           <TextBlock Height="24" FontSize="12" Padding="5" Text="{Binding Path=Name}" /> 
          </StackPanel>         
         </TreeViewItem.Header>        
        </TreeViewItem>       
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
</Style> 

<TreeView Name="menuTreeView" 
       Background="Transparent" 
       BorderBrush="Transparent" 
       VerticalAlignment="Stretch" 
       HorizontalAlignment="Stretch" 
       Margin="10" 
       ItemContainerStyle="{StaticResource treeViewItemStyle}">     
</TreeView> 

Merci,

Xam

Répondre

1

Vous appliquez la "treeViewItemStyle" seulement au premier niveau d'éléments dans l'arborescence. Vous devez le définir ainsi que ItemContainerStyle des TreeViewItems. Donc, dans votre ControlTemplate, vous aurez besoin de quelque chose comme:

<ControlTemplate TargetType="TreeViewItem"> 
    <TreeViewItem ItemContainerStyle="{StaticResource treeViewItemStyle}".../> 
</ControlTemplate> 

Mieux encore, vous pouvez simplement supprimer le « x: Key » attribut dans votre déclaration de style. Cela appliquera automatiquement le style à tous TreeViewItems.

SIDE NOTE:

Je suggère qu'au lieu de passer outre ControlTemplate comme ce que vous avez fait ci-dessus, il suffit d'utiliser la propriété Setters dans le style à la place. Quelque chose comme:

<Style TargetType="TreeViewItem"> 
    <Setter Property="IsExpanded" Value="{Binding Path=IsExpanded, Mode=TwoWay}"/> 
    <Setter Property="ItemsSource" Value="{Binding Path=SubCategories}"/> 
    <Setter Property="ItemTemplate" Value="{StaticResource menuHierarchicalTemplate}"/> 
    <Setter Property="Header"> 
     <Setter.Value> 
      <StackPanel Orientation="Horizontal" > 
       <TextBlock Height="24" FontSize="12" Padding="5" Text="{Binding Path=Name}" /> 
      </StackPanel> 
     </Setter.Value> 
    </Setter> 
</Style> 

Il est tout à fait inhabituel d'utiliser le même contrôle dans le cadre du ControlTemplate de lui-même (à savoir l'utilisation TreeViewItem dans le ControlTemplate d'un TreeViewItem).

+0

Merci pour votre réponse. Malheureusement, l'analyseur XAML ne me laisse pas appliquer le même style récursivement à de nombreux attributs ItemContainerStyle. Votre idée de simplement utiliser des setters était bonne, mais en raison de problèmes de sélection d'éléments, je dois utiliser le modèle que j'ai déjà. Il semble que la seule façon de contourner tout cela est de créer le même style TreeViewItem plusieurs fois avec des noms différents afin d'étendre une hiérarchie plus profonde. C'est mauvais car cela limitera artificiellement la profondeur à laquelle je peux développer chaque nœud TreeViewItem. Avez-vous d'autres suggestions? – Xam

+0

Lorsque j'utilise votre approche de note de côté, je reçois toujours une exception qui stipule que "l'élément spécifié est déjà l'enfant logique d'un autre élément. Déconnectez-le d'abord". – Xam

+0

re: exception. vous l'obtenez probablement parce que vous définissez la propriété TreeViewItem.Header sur le style et le HierarchicalDataTemplate. Essayez d'en supprimer un et voyez si cela fonctionne. – ASanch

Questions connexes