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

转载于:https://www.cnblogs.com/diculess/p/7424688.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: WPF ComboBox 和 TreeView 都是 WPF 控件库中非常实用的控件,它们可以在应用程序中提供灵活性以及可扩展性。在 WPF 中,开发人员可以使用定义数据模型为 ComboBox 和 TreeView 创建自定义数据,以支持针对具有复杂数据结构的对象的数据绑定。 自定义 WPF ComboBox 控件可以通过创建自定义控件模板来实现。开发人员可以使用 XAML 和控件模板定义 ComboBox 的外观和行为,并使用代码实现控件的行为。例如,可以使用控件模板将 ComboBox 中的列表项设计成树形结构,以支持绑定到具有层次结构的数据模型。 自定义 WPF TreeView 控件可以通过创建自定义控件模板和自定义 ItemTemplate 来实现。控件模板定义 TreeView 的外观和行为,而 ItemTemplate 用于定义 TreeView 中每个节点的外观和行为。开发人员可以在 ItemTemplate 中添加控件,如 Button、CheckBox 或 RadioButton,以在 TreeView 节点的视觉表示中添加交互元素。还可以使用 ItemContainerStyle 属性定义节点的容器风格,包括每个节点应如何显示。 总之,自定义 WPF ComboBox 和 TreeView 控件可以帮助开发人员创建更具交互性和可视化效果的应用程序。通过使用定义控件模板和数据绑定功能,可以轻松地确保这些控件与数据模型的各个部分保持同步,并以最佳方式展现数据。 ### 回答2: WPF中的ComboBox和TreeView是非常有用的控件,它们可以满足不同场合下的数据呈现和交互需求。如果需要自定义这两个控件,可以按照以下步骤进行: 1. 自定义ComboBox:通过继承ComboBox类来自定义ComboBox,可以在构造函数中初始化控件外观和行为,还可以添加需要的事件。 2. 自定义TreeView:通过继承TreeView类来自定义TreeView,可以在构造函数中初始化控件外观和行为,还可以添加需要的事件。如果需要添加节点的复选框或者自定义节点模板,可以重写TreeViewItem类。 3. 自定义ComboBox中的TreeView:在ComboBox控件中添加TreeView控件,通过设置TreeView的样式、模板和事件来自定义TreeView。 4. 数据绑定:通过数据绑定来绑定ComboBox和TreeView,可以将数据绑定到ComboBox或者TreeView中,并在需要的事件中更新数据。 5. 效率优化:如果需要展示大量的节点,可以采用虚拟化技术,例如使用VirtualizingStackPanel控件来优化TreeView的性能。 总之,自定义WPF中的ComboBox和TreeView可以使其更加符合实际需求,提高用户体验和效率。 ### 回答3: WPF中的ComboBox和TreeView控件都是非常常见且灵活的控件,但是在某些特定的应用场景中,我们可能需要对其进行定制化,以满足特定的需求。因此,我们可以对这些控件进行自定义,使其更加符合我们的业务逻辑和界面设计。 对于ComboBox控件,我们可以通过绑定数据和设置模板,来实现自定义下拉列表的样式和内容。如果需要实现ComboBox的级联功能,我们可以借助于其它控件之间的数据绑定,或者使用第三方开控件实现。另外,我们还可以通过重写ComboBox的样式文件,来实现自定义ComboBox的外观和交互效果。 对于TreeView控件,我们可以通过绑定数据和设置模板,来自定义其节点的样式、内容和布局。如果需要实现TreeView的多选功能,我们可以使用定义TreeViewItem,并在其上添加CheckBox控件。另外,我们还可以通过重写TreeView的样式文件,来实现自定义TreeView的外观和交互效果。 无论是ComboBox还是TreeView,我们都可以使用定义控件的方式进行定制化,以满足不同的应用场景和设计要求。同时,我们也可以借助于WPF中的各种控件和技术,来实现更加复杂和高效的自定义控件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值