2017-09-11 2 views
0

J'ai un code qui affiche les noms de fichiers et de dossiers dans un TreeView et met une case à cocher de chaque élément. Qu'est-ce que je ne sais pas comment faire est de savoir comment les éléments dans le TreeView qui sont sélectionnés avec les cases à cocher.TreeView avec CheckBoxes dynamiquement WPF. Comment connaître le nom des éléments sélectionnés

XAML:

<TreeView Name="treeView" Grid.Row="10" Grid.ColumnSpan="3"> 
     <TreeView.Resources> 
      <Style TargetType="{x:Type TreeViewItem}"> 
       <Setter Property="HeaderTemplate"> 
        <Setter.Value> 
         <DataTemplate> 
          <StackPanel Orientation="Horizontal"> 
           <CheckBox Focusable="False" IsChecked="False" VerticalAlignment="Center"/> 
           <TextBlock Text="{Binding}" Margin="5,0" /> 
          </StackPanel> 
         </DataTemplate> 
        </Setter.Value> 
       </Setter> 
      </Style> 
     </TreeView.Resources> 
    </TreeView> 

Programme:

DirectoryInfo di = new DirectoryInfo(folder); 
    treeView.Items.Add(getTree(di)); 

    public TreeViewItem getTree(DirectoryInfo di) 
    { 
     TreeViewItem item = new TreeViewItem(); 
     item.Header = di.Name; 
     item.FontWeight = FontWeights.Normal; 
     foreach (DirectoryInfo s in di.GetDirectories()) 
     { 
      item.Items.Add(getTree(s)); 
     } 
     foreach (FileInfo fi in di.GetFiles()) 
     { 
      item.Items.Add(fi.Name); 
     } 
     return item; 
    } 
+2

S'il est possible de parcourir manuellement les éléments dans le TreeView, je vous suggère de changer votre code pour l'approche MVVM. Ensuite, vous pouvez facilement parcourir vos éléments de modèle de vue sans avoir à vous soucier des propriétés de la vue. – dymanoid

Répondre

1

Créer votre propre type TreeViewItem:

public class Node 
{ 
    public string Name { get; set; } 
    public bool IsChecked { get; set; } 
    public List<Node> Children { get; } = new List<Node>(); 
} 

Ajouter instance de ce type à l'TreeView:

public Node getTree(DirectoryInfo di) 
{ 
    Node item = new Node(); 
    item.Name = di.Name; 
    foreach (DirectoryInfo s in di.GetDirectories()) 
    { 
     item.Children.Add(getTree(s)); 
    } 
    foreach (FileInfo fi in di.GetFiles()) 
    { 
     item.Children.Add(new Node { Name = fi.Name }); 
    } 
    return item; 
} 

se lient aux propriétés de ce type dans la vue:

<TreeView Name="treeView" Grid.Row="10" Grid.ColumnSpan="3"> 
    <TreeView.Resources> 
     <HierarchicalDataTemplate DataType="{x:Type local:Node}" ItemsSource="{Binding Children}"> 
      <StackPanel Orientation="Horizontal"> 
       <CheckBox Focusable="False" IsChecked="{Binding IsChecked}" VerticalAlignment="Center"/> 
       <TextBlock Text="{Binding Name}" Margin="5,0" /> 
      </StackPanel> 
     </HierarchicalDataTemplate> 
    </TreeView.Resources> 
</TreeView> 

Vous pouvez ensuite parcourir les articles récursive et vérifier la valeur de la propriété IsChecked:

private List<string> GetSelectedNames() 
{ 
    List<string> selectedNames = new List<string>(); 
    foreach (var item in treeView.Items.OfType<Node>()) 
     GetSelected(item, ref selectedNames); 
    return selectedNames; 
} 

public void GetSelected(Node node, ref List<string> s) 
{ 
    if (node.IsChecked) 
     s.Add(node.Name); 

    foreach (Node child in node.Children) 
     GetSelected(child, ref s); 
} 

Si vous voulez prenez ceci un peu plus loin, vous liez la propriété ItemsSource du TreeView à une propriété IEnumerable<Node> de votre modèle de vue et parcourez celle-ci à la place de la propriété Items du TreeView contrôle.

+0

Merci, je peux travailler à partir de ça – lk009