c# - TreeView with CheckBoxes dynamically WPF. How to know the name of the elements selected -


i have code displays files , folders names in treeview , put checkbox each element. don't know how how know elements in treeview selected checkboxes.

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> 

program:

    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;     } 

create own treeviewitem type:

public class node {     public string name { get; set; }     public bool ischecked { get; set; }     public list<node> children { get; } = new list<node>(); } 

add instance of type 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; } 

bind properties of type in view:

<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> 

you iterate through items recursively , check value of ischecked property:

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); } 

if want take step further, bind itemssource property of treeview ienumerable<node> property of view model , iterate through 1 instead of items property of treeview control.


Comments

Popular posts from this blog

Sort a complex associative array in PHP -

vb.net - How to ignore if a cell is empty nothing -

recursion - Can every recursive algorithm be improved with dynamic programming? -