WPF 使用自定义类型作为 TreeView 的数据源

 1 internal class BinaryNodeItem //作用于内部的自定义类型
 2         {
 3             public int ID { get; set; } //对应SQL表中id值,本节点ID
 4             public string Name { get; set; } //对应SQL表中name值,用作显示文字
 5             public int ParentID { get; set; } //对应SQL表中parent_id值,父节点ID
 6             public bool IsExpanded { get; set; } //是否展开
 7             public List<BinaryNodeItem> Items { get; set; } //一个List作为普通TreeViewItem中的Items来用,注意T类型要相同
 8             public BinaryNodeItem() { Items = new List<BinaryNodeItem>(); } //在实例化BinaryNodeItem的时候自动实例化它的Items,否则给 null 对象 Add 会抛错
 9         }
10 
11 BindingList<BinaryNodeItem> bnis = new BindingList<BinaryNodeItem>();//在循环体外部实例化一个自定义类型的集合,BindingList 和普通的 List 比,有一个好处是后台对 BindingList 中的内容更新的时候,控件的显示会自动更新
12 
13 //设置树状图数据源
14 //参数1:父级节点[因为根节点的话父级是TreeView本身所以类型得用万能的obejct]
15 //参数2:查询的表名,这里是role_body表,SQL_Doc.SQL_Fetch是我自己写的事件,返回一个包含查询结果的DataSet,这里自行查询所用的SQL的使用说明,之后有机会也会把自己的发到博客里可以搜索看看
16 //参数3:用于循环查询的父级ID[自己调用时保持默认,这个参数是给事件内部循环调用,查询 WHERE parent_id=xx 的时候用的])
17         private BindingList<BinaryNodeItem> SetTreeViewSource(object Parent, string Table, int ParentID = -1)
18         {
19             //获取根节点,准备数据源,假设已有表格
20             DataTable dt = SQL_Doc.SQL_Fetch("SELECT * FROM " + Table + " WHERE parent_id = " + ParentID.ToString()).Tables[0];
21             //生成用于绑定的列表
22             if (ParentID == -1) { bnis = new BindingList<BinaryNodeItem>(); }
23             foreach (DataRow r in dt.Rows) //对每一个需要添加的根节点
24             {
25                 BinaryNodeItem bni = new BinaryNodeItem() //实例化一个根节点并填充数据
26                 {
27                     Name = r["name"].ToString(),
28                     ID = Convert.ToInt32(r["id"]),
29                     ParentID = Convert.ToInt32(r["parent_id"].ToString()),
30                     IsExpanded = true
31                 };
32                 SetTreeViewSource(bni, Table, bni.ID); //循环添加子节点(父级节点,表名,父级节点的ID)
33                 //把此节点加入到父级节点(对根节点则加入用于填充TreeView的数据源)中
34                 if (ParentID == -1) { bnis.Add(bni); } else {((BinaryNodeItem)Parent).Items.Add(bni); }
35             }
36 
37             return bnis; //设置数据源
38         }
查看后台 C# 代码
 1 <TreeView.ItemContainerStyle>
 2    <Style TargetType="{x:Type TreeViewItem}">
 3        <Setter Property="IsExpanded" Value="{Binding IsExpanded}"></Setter>
 4    </Style>
 5 </TreeView.ItemContainerStyle>
 6 
 7 <TreeView.ItemTemplate>              
 8     <HierarchicalDataTemplate  ItemsSource="{Binding Path=Items}">
 9         <TextBlock VerticalAlignment="Center" Text="{Binding Name}" TextWrapping="Wrap"></TextBlock>
10     </HierarchicalDataTemplate>                
11 </TreeView.ItemTemplate>
查看前台 XAML 代码
1 TreeView1.ItemsSource = SetTreeViewSource(TreeView1, "role_body"); //参数1为需要填充的TreeView,参数2为string类型的表名
查看调用 C# 代码

顺便迫切要吐槽 cnblogs 输入代码的对话框,按ESC不保存直接退出对话框,输入法打错重打也是按ESC,表示为了输入一些注释,不小心按了ESC超过7次,重写了注释7次……

posted @ 2017-08-24 18:25  黑龙大爷  阅读(506)  评论(0)    收藏  举报