2010-08-24 3 views
3

J'ai donc un problème avec TreeView. Si je construis une vue arborescente de manière statique, chaque nœud de l'arbre est sélectionnable en ce sens que lorsque je clique dessus, il se met en évidence en bleu, indiquant que le nœud est sélectionné.WPF/XAML TreeView ne reconnaît pas les nœuds après la liaison

<TreeView 
    Grid.Column="0" 
    Grid.Row="2" 
    MinHeight="100" 
    MinWidth="100" 
    BorderBrush="White" 
    DataContext="{Binding Projects, Source={x:Static SizingApp:Manager.Instance}}"> 
<TreeViewItem Header="Project 1" IsExpanded="True"> 
    <TreeViewItem Header="Step 1" IsExpanded="True"> 
     <TreeViewItem Header="Load 1" IsExpanded="True"></TreeViewItem> 
     <TreeViewItem Header="Load 2" IsExpanded="True"></TreeViewItem> 
    </TreeViewItem> 
    <TreeViewItem Header="Step 2" IsExpanded="True"> 
     <TreeViewItem Header="Load 1" IsExpanded="True"></TreeViewItem> 
     <TreeViewItem Header="Load 2" IsExpanded="True"></TreeViewItem> 
    </TreeViewItem> 
</TreeViewItem> 

Cependant, je suis la liaison à la TreeView pour le remplir. En outre, je lie aux objets qui implémentent Emiel Jongerius's BindableObjectBase3 class. C'est une merveilleuse implémentation de classe de base qui permet à mes objets d'être Bindable et d'implémenter l'interface INotifyPropertyChanged avec le souci de la gestion manuelle de DependencyProperty.

Donc, c'est la structure de classe de base (simplifiée à partir de mes objets réels) que j'essaye d'implémenter dans un TreeView.

public abstract class MyCustomClass : BindableObjectBase3 
{ 
    private string m_strName; 

    public virtual string Name 
    { 
     get 
     { 
      using (this.GetPropertyTracker(() => this.Name)) 
      { 
       return m_strName; 
      } 
     } 
     set 
     { 
      this.SetValue(ref this.m_strName, value,() => this.Name); 
     } 
    } 
} 

public class Project : MyCustomClass 
{ 
    private List<Step> m_steps; 

    public List<Step> Steps 
    { 
     get 
     { 
      using (this.GetPropertyTracker(() => this.Steps)) 
      { 
       return m_steps; 
      } 
     } 
     set 
     { 
      this.SetValue(ref this.m_steps, value,() => this.Steps); 
     } 
    } 
} 

public class Step : MyCustomClass 
{ 
    private List<Load> m_loads; 

    public List<Load> Loads 
    { 
     get 
     { 
      using (this.GetPropertyTracker(() => this.Loads)) 
      { 
       return m_loads; 
      } 
     } 
     set 
     { 
      this.SetValue(ref this.m_loads, value,() => this.Steps); 
     } 
    } 
} 

public class Load : MyCustomClass 
{ 
} 

Et c'est le XAML de base que j'utilise pour mettre en œuvre le TreeView:

<TreeView 
    Grid.Column="0" 
    Grid.Row="2" 
    MinHeight="100" 
    MinWidth="100" 
    BorderBrush="White" 
    DataContext="{Binding Projects, Source={x:Static SizingApp:Manager.Instance}}"> 
    <TreeView.Resources> 
     <HierarchicalDataTemplate x:Key="LoadTemplate"> 
      <TreeViewItem Header="{Binding Path=Name}"> 
      </TreeViewItem> 
     </HierarchicalDataTemplate> 
     <HierarchicalDataTemplate x:Key="StepTemplate"> 
      <TreeViewItem Header="{Binding Path=Name}" IsExpanded="True" 
        ItemsSource="{Binding Path=Loads}" 
        ItemTemplate="{StaticResource LoadTemplate}"> 
      </TreeViewItem> 
     </HierarchicalDataTemplate> 
     <HierarchicalDataTemplate x:Key="ProjectTemplate"> 
      <TreeViewItem Header="{Binding Path=Name}" IsExpanded="True" 
        ItemsSource="{Binding Path=Steps}" 
        ItemTemplate="{StaticResource StepTemplate}"> 
      </TreeViewItem> 
     </HierarchicalDataTemplate> 
    </TreeView.Resources> 
    <TreeViewItem 
      Header="{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources, Key=projectTree_Header}" 
      ItemsSource="{Binding}" 
      IsExpanded="True" 
      Focusable="True" 
      ItemTemplate="{StaticResource ProjectTemplate}"> 
    </TreeViewItem> 
</TreeView> 

Maintenant, tout cela fonctionne bien dans la mesure où la liaison va. Je peux lier à un ObservableCollection <Project> et comme j'ajoute/supprime/manipule des projets, le TreeView se met à jour en conséquence.

Cependant, le seul nœud dans le TreeView qui semble sélectionnable est le premier nœud (celui qui est statique). Tous les autres nœuds créés via la liaison dynamique n'indiquent pas qu'ils sont sélectionnés sur l'interface graphique. Je m'attendrais à ce qu'ils mettent également en évidence le bleu quand on clique dessus. Mais à la place, ils ne font rien. Est-ce que quelqu'un a une idée de pourquoi?

+0

Je ne peux pas croire que personne n'a jamais rencontré ce problème avant? – Ristogod

Répondre

4

Vous ne devez pas définir TreeViewItems explicitement dans vos ItemTemplates. La raison pour laquelle vous ne pouvez sélectionner aucun des éléments est qu'ils n'ont pas TreeView parent pour contrôler le comportement de sélection. Vous devez laisser TreeView générer les contrôles TreeViewItem pour vous et utiliser uniquement les modèles d'éléments pour définir l'interface utilisateur pour les en-têtes et les liaisons pour leurs éléments. Utilisez quelque chose comme ceci:

<Window.Resources> 
    <HierarchicalDataTemplate x:Key="LoadTemplate"> 
     <TextBlock Text="{Binding Path=Name}"/> 
    </HierarchicalDataTemplate> 
    <HierarchicalDataTemplate x:Key="StepTemplate" ItemsSource="{Binding Loads}" ItemTemplate="{StaticResource LoadTemplate}"> 
     <TextBlock Text="{Binding Path=Name}"/> 
    </HierarchicalDataTemplate> 
    <HierarchicalDataTemplate x:Key="ProjectTemplate" ItemsSource="{Binding Steps}" ItemTemplate="{StaticResource StepTemplate}"> 
     <TextBlock Text="{Binding Path=Name}"/> 
    </HierarchicalDataTemplate> 
</Window.Resources> 

<TreeView MinHeight="100" MinWidth="100" BorderBrush="White" 
      ItemsSource="{Binding Path=Projects}" 
      ItemTemplate="{StaticResource ProjectTemplate}"> 
    <TreeView.ItemContainerStyle> 
     <Style TargetType="{x:Type TreeViewItem}"> 
      <Setter Property="IsExpanded" Value="True" /> 
     </Style> 
    </TreeView.ItemContainerStyle> 
</TreeView> 
+0

Merci beaucoup. Tellement de déterminer ce contrôle semble non intuitif. Je suis heureux que vous puissiez partager votre expérience. Merci. – Ristogod

1

Mon TreeView agit exactement comme l'affiche originale l'a décrit. Je suis capable de tout sélectionner dans mon contrôle TreeView mais si je sélectionne un nœud enfant, le nœud parent est ce qui souligne même s'il lie et clique sur l'enfant. J'ai essayé de structurer mon code pour ressembler à la suggestion de John Bowen et obtenir toujours les mêmes résultats. Voici mon code XAML:

<Fluent:RibbonWindow.Resources> 
     <HierarchicalDataTemplate x:Key="MyTreeViewStyle" ItemsSource="{Binding Contacts}"> 
      <!-- Display the Index by showing it's Index string --> 
      <StackPanel Orientation="Horizontal"> 
       <Image x:Name="img" Width="16" Height="16" Stretch="Fill" Source="Images\closedfolder16.png" /> 
       <TextBlock Text="{Binding Index}" Margin="5,0" ToolTip="{Binding Index}"/> 
      </StackPanel> 
      <HierarchicalDataTemplate.ItemTemplate> 
       <DataTemplate> 
        <StackPanel Orientation="Horizontal"> 
         <Image x:Name="img2" Width="16" Height="16" Stretch="Fill" Source="Images\closedfolder16.png" /> 
         <TextBlock Text="{Binding Name}" Margin="5,0" ToolTip="{Binding Name}"/> 
        </StackPanel> 
       </DataTemplate> 
      </HierarchicalDataTemplate.ItemTemplate> 
     </HierarchicalDataTemplate> 
</Fluent:RibbonWindow.Resources> 

Puis-je utiliser ici dans mon contrôle TreeView:

   <Grid> 
        <TreeView Margin="2,2,2,2" x:Name="MyTreeView" ItemTemplate="{StaticResource MyTreeViewStyle}" ItemContainerStyle="{StaticResource AlwaysExpand}" ScrollViewer.CanContentScroll="True" BorderThickness="0" TreeViewItem.Selected="btnDisplayContact_Click" />      
       </Grid> 

Le résultat est cette capture d'écran, remarquez comment le nœud parent D est mise en évidence après avoir cliqué sur le nœud enfant, au lieu du nœud enfant étant mis en évidence:

http://home.swbell.net/davis32/Snapshot.png

ne pouvez pas poster des images si juste couper et coller le lien URL.

Questions connexes