2010-11-15 4 views
0

J'ai une vue arborescente avec des cases à cocher pour chaque élément utilisant un DataTemplate.Accès à l'index sélectionné dans WPF Treeview via un objet TreeViewItem

<TreeView ItemsSource="{Binding}"> 
<DataTemplate DataType="{x:Type local:MatchDataLeaf}"> 
    <Grid Margin="3"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="240"/> 
      <ColumnDefinition Width="100"/> 
      <ColumnDefinition Width="150"/> 
      <ColumnDefinition Width="*"/> 
      <ColumnDefinition Width="60"/> 
     </Grid.ColumnDefinitions> 

     <StackPanel Grid.Column="0" Orientation="Horizontal"> 
      <CheckBox x:Name="selectCheckBtn" Grid.Column="0" IsChecked="True" Click="select_Click" 
         Tag="{Binding}" CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type TreeViewItem}}}"/> 
      <TextBlock Grid.Column="1" Margin="5,0,0,0" Text="{Binding Path=Name}" FontFamily="Arial" FontSize="12" FontWeight="Bold" Foreground="Black" VerticalAlignment="Center"/> 
    </StackPanel> 
</Grid> 
</DataTemplate> 

En cas de clic de case à cocher, je suis en train de comprendre l'index sélectionné dans la liste binded de l'arbre principal. Le plus proche est de passer l'objet TreeViewItem dans le CommandParameter, mais je ne peux rien faire avec. J'ai été capable de la parent ItemsControl en utilisant:

Mais s = -1 ici. J'ai également la balise sur la case qui contient l'objet sous-jacent. Bien sûr, je peux faire une recherche sur ma liste pour l'objet, mais il semble juste qu'il doit y avoir un moyen plus simple de trouver l'index.

Répondre

0

La commande ItemsControl que vous récupérez peut être le StackPanel ou la grille. Vous devriez être en mesure d'accéder à la case à cocher via l'expéditeur de l'événement, et naviguer jusqu'à TreeViewItem et TreeView et utiliser IndexOf.

private void CheckBox_Click(object sender, RoutedEventArgs e) 
{ 
     CheckBox cb = (CheckBox)sender; 
     StackPanel sp = (StackPanel)cb.Parent; 
     Grid g = (Grid)sp.Parent; 
     ContentPresenter cp = (ContentPresenter)VisualTreeHelper.GetParent(g); 
     IList l = (IList)myTreeView.ItemsSource; 
     object o = cp.Content; 
     MessageBox.Show(l.IndexOf(o).ToString()); 
} 
+0

Merci. Le parent de sp est la grille, et son parent est null. – user350213

+0

Essayez d'utiliser VisualTreeHelper.GetParent (grille). –

+0

renvoie le ContentPresenter - Comment obtenez-vous le TreeViewItem de cela? – user350213

Questions connexes