2009-05-07 10 views
2

J'utilise un modèle de présentation pour implémenter la navigation dans mon application avec le contrôle TreeView. J'ai la propriété IsSelected de TreeViewItem liée à mon modèle de vue via une liaison bidirectionnelle. Quand un nœud qui a des enfants est sélectionné, je veux que le premier enfant de ce nœud soit sélectionné à la place de celui sur lequel on clique. Il semble que le TreeViewItem n'écoute pas l'événement de modification de propriété lorsqu'il définit la propriété IsSelected sur mon modèle de présentation. Le premier noeud enfant est sélectionné, mais le noeud parent n'est pas désélectionné. Voici le code de mon modèle de présentation.WPF TreeView souhaite sélectionner le premier enfant lorsque parent est sélectionné

public bool IsSelected { 
    get { 
     return this._isSelected; 
    } 
    set { 
     if(this._isSelected != value) { 
      this._isSelected = value; 
      if(this.Nodes.Count > 0) { 
       this._isSelected = false; 
       this.Nodes[0].IsSelected = true; 
      } 
      this.NotifyPropertyChanged("IsSelected"); 
     } 
    } 
} 

Et voici le style de mon TreeViewItem:

<Style TargetType="{x:Type TreeViewItem}"> 
    <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" /> 
</Style> 

Répondre

1

J'ai eu un problème très similaire et j'ai découvert que lorsque je sélectionne un enfant par code Je dois aussi donner le focus à la TreeViewItem wrapper de sorte que le nœud parent sera ce que vous avez appelé "UnSelect". donc dans le XAML i ajouté un gestionnaire d'événements:

<EventSetter Event="TreeViewItem.Selected" 
        Handler="TreeViewItem_Selected" 
         /> 

Et dans la classe partielle:

Private Sub TreeViewItem_Selected(ByVal sender As System.Object, ByVal e As RoutedEventArgs) 
      If CType(sender, TreeViewItem) IsNot Nothing Then 
       CType(sender, TreeViewItem).Focus() 
       e.Handled = True 
      End If 
End Sub 
+0

Cela a fonctionné. J'ai eu le même problème que awilinsk lors de la sélection d'un usercontrol dans un treeviewitem. Le contrôle de l'utilisateur était en train de se concentrer manuellement sur un élément et cela a causé le problème de double sélection. Merci, j'ai passé trop de temps là-dessus. – kimphamg

1

Une autre possibilité à considérer:

TreeView tente de vous assurer qu'il est impossible pour deux TreeViewItems dans l'arbre à sélectionner à la fois, donc cela devrait empêcher cela. C'est peut-être un bug dans TreeView, mais cela pourrait aussi être un problème avec la façon dont vous utilisez TreeView. Pour des raisons d'efficacité, TreeView est très pointilleux sur la façon dont il trouve les TreeViewItems en dessous. L'algorithme est effectivement ce (fait de façon progressive):

  1. Regardez dans mes conteneurs d'éléments pour les objets TreeView
  2. Regardez parmi les les conteneurs d'éléments objets TreeView de pour plus d'objets TreeView
  3. Répétez l'étape 3 jusqu'à ce qu'il ne more TreeView objects found

De ce fait, TreeView ne peut trouver ses descendants que si chaque niveau de TreeViewItems est directement inférieur au précédent.

Par exemple, cela fonctionnerait:

<TreeView> 
    <TreeViewItem> 
    <TreeViewItem /> 
    </TreeViewItem> 
    ... 
</TreeView> 

et voilà ce que ceci:

<HierarchicalDataTemplate TargetType="{x:Type MyItemType"} ItemsSource="{Binding subItems}"> 
    ... 
</HierarchicalDataTemplate> 

<TreeView ItemsSource="{Binding items}" /> 

Mais il ne fonctionnera pas si sont interposés non TreeViewItems, comme ceci:

<TreeView> 
    <TreeViewItem> 
    <Border> 
     <TreeViewItem/> 
    </Border> 
    </TreeViewItem> 
</TreeView> 

ou ceci:

<TreeView> 
    <DockPanel> 
    <TreeViewItem> 
     <TreeViewItem/> 
    </TreeViewItem> 
    </DockPanel> 
</TreeView> 

Ces deux derniers cas s'afficheront correctement, mais TreeView ne verra pas TreeViewItems de sorte que son code de sélection sera désactivé. Cela causerait les symptômes que vous décrivez.

Je ne sais pas si c'est la situation dans votre cas ou non, mais je pensais que je devrais le mentionner au cas où.

Questions connexes