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
Post a Comment