服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - c# WPF中的TreeView使用详解

c# WPF中的TreeView使用详解

2022-11-08 12:08Yhzwei C#

这篇文章主要介绍了c# WPF中的TreeView使用详解,帮助大家更好的理解和学习使用c#技术,感兴趣的朋友可以了解下

在wpf中实现treeview的功能,可能看到很多分享的都是简单的绑定,仅此记录自己完成的功能。

前台

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<TreeView x:Name="chapterTree" Grid.Column="0" SelectedItemChanged="chapterTree_SelectedItemChanged" PreviewMouseRightButtonDown="chapterTree_PreviewMouseRightButtonDown" FontSize="14" ItemsSource="{Binding Path=Nodes}" >
      
      <TreeView.ContextMenu>
       <ContextMenu>
        <MenuItem Header="保存" Name="btnAlterData" Click="btnAlterData_Click" />
        <MenuItem Header="新增兄弟节点" Name="btnSaveData" Click="btnSaveData_Click"/>
        <MenuItem Header="新增子节点" Name="btnSaveSonData" Click="btnSaveSonData_Click"/>
        <MenuItem Header="删除" Name="btnDdeleteData" Click="btnDdeleteData_Click"/>
        <MenuItem Header="上移一位" Name="btnUp" Click="btnUp_Click"/>
        <MenuItem Header="下移一位" Name="btnDown" Click="btnDown_Click"/>
       </ContextMenu>
      </TreeView.ContextMenu>
      <TreeView.ItemTemplate>
       <HierarchicalDataTemplate DataType="{x:Type c:OrderModel}" ItemsSource="{Binding Path=ChildNodes}">
        <Label Content="{Binding Path=OrderName}"/>
       </HierarchicalDataTemplate>
      </TreeView.ItemTemplate>
     </TreeView>

后台

?
1
2
3
4
5
6
7
8
9
CommandModel cm;
 
  public Command()
  {
   InitializeComponent();
   cm = new CommandModel();
   chapterTree.ItemsSource = cm.Nodes;
 
  }

新建了CommandModel页面用来绑定数据(从数据库提取的数据,转换成了list)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
public event PropertyChangedEventHandler PropertyChanged;
  private ObservableCollection<OrderModel> nodes = new ObservableCollection<OrderModel>();
  public ObservableCollection<OrderModel> Nodes
  {
   get { return nodes; }
   set
   {
    nodes = value;
    if (PropertyChanged != null)
     PropertyChanged(this, new PropertyChangedEventArgs("Nodes"));
   }
  }
  
  public CommandModel()
  {
   Initiate();
  }
  private void Initiate()
  {
   using (SQLiteConnection con = new SQLiteConnection(MainWindow.sb.ToString()))
   {
    DataTable table = new DataTable("MyTable");
    var reader = con.ExecuteReader("SELECT * FROM OrderData Order by OrderID");
    table.Load(reader);
    ObservableCollection<OrderModel> _nodes = new ObservableCollection<OrderModel>();
    _nodes = ConvertToList(table);
 
    //ShowTreeView();
    Nodes = getChildNodes(0, _nodes);
 
   }
  }
 
  private ObservableCollection<OrderModel> getChildNodes(long parentID, ObservableCollection<OrderModel> nodes)
  {
   List<OrderModel> a = new List<OrderModel>(nodes.Where(x => x.ParentID == parentID).ToList());
   ObservableCollection<OrderModel> mainNodes =new ObservableCollection<OrderModel>(a);
   List<OrderModel> b = new List<OrderModel>(nodes.Where(x => x.ParentID != parentID).ToList());
   ObservableCollection<OrderModel> otherNodes =new ObservableCollection<OrderModel>(b);
   foreach (OrderModel node in mainNodes)
    node.ChildNodes = getChildNodes(node.ID, otherNodes);
   return mainNodes;
  }
 
 
 
 
  #region datatable转list
 
  /// <summary>
  /// datatable转list
  /// </summary>
  /// <param name="dt"></param>
  /// <returns></returns>
  public static ObservableCollection<OrderModel> ConvertToList(DataTable dt)
  {
 
   // 定义集合
   ObservableCollection<OrderModel> ts = new ObservableCollection<OrderModel>();
 
   // 获得此模型的类型
   Type type = typeof(OrderModel);
   //定义一个临时变量
   string tempName = string.Empty;
   //遍历DataTable中所有的数据行
   foreach (DataRow dr in dt.Rows)
   {
    OrderModel t = new OrderModel();
    // 获得此模型的公共属性
    PropertyInfo[] propertys = t.GetType().GetProperties();
    //遍历该对象的所有属性
    foreach (PropertyInfo pi in propertys)
    {
     tempName = pi.Name;//将属性名称赋值给临时变量
     //检查DataTable是否包含此列(列名==对象的属性名)
     if (dt.Columns.Contains(tempName))
     {
      // 判断此属性是否有Setter
      if (!pi.CanWrite) continue;//该属性不可写,直接跳出
      //取值
      object value = dr[tempName];
      //如果非空,则赋给对象的属性
      if (value != DBNull.Value)
       pi.SetValue(t, value, null);
     }
    }
    //对象添加到泛型集合中
    ts.Add(t);
   }
 
   return ts;
  }
 
  #endregion

model页面的列中需要添加

?
1
2
3
4
5
public ObservableCollection<OrderModel> ChildNodes { get; set; }
public OrderModel()
{
 ChildNodes = new ObservableCollection<OrderModel>();
}

以上就是c# WPF中的TreeView使用详解的详细内容,更多关于c# WPF中的TreeView的资料请关注服务器之家其它相关文章!

原文链接:https://www.cnblogs.com/lzwei/archive/2021/03/15/12934308.html

延伸 · 阅读

精彩推荐
  • C#一文说通C#的属性Attribute

    一文说通C#的属性Attribute

    属性Attributes在C#中很常用,但事实上很多人对这个东西又很陌生。从概念上讲,属性提供的是将元数据关系到元素的一种方式。...

    老王Plus5962021-04-14
  • C#C#与PHP的md5计算结果不同的解决方法

    C#与PHP的md5计算结果不同的解决方法

    今天在用C#接入我的登录api发现了一个问题,登陆的时候无论如何都会出现用户名和密码错误的问题,后来通过查找排除找的了问题的原因是因为C#与PHP的...

    ifengge3702021-12-15
  • C#C#和Java有什么区别和联系

    C#和Java有什么区别和联系

    这篇文章主要介绍了C#和Java有什么区别和联系的相关资料,本文介绍的非常详细,涉及到rsa语法,c#和java互转方面的知识点,非常不错,具有参考借鉴价值,...

    一只LowCoder8312021-12-01
  • C#C#通过正则表达式实现提取网页中的图片

    C#通过正则表达式实现提取网页中的图片

    本文给大家分享的是使用C#通过正则表达式来实现提取网页中的图片的代码,十分的方便,有需要的小伙伴可以参考下。...

    C#教程网8782021-11-05
  • C#C#打开扬声器的实操方法和代码

    C#打开扬声器的实操方法和代码

    在本篇文章中我们给大家分享的是关于C#如何打开扬声器的相关知识点内容,需要的读者们学习下。...

    ITMFB7632022-07-31
  • C#c++ STL之list对结构体的增加,删除,排序等操作详解

    c++ STL之list对结构体的增加,删除,排序等操作详解

    这篇文章主要介绍了c++ STL之list对结构体的增加,删除,排序等操作详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    lady_killer99032022-10-21
  • C#C# 9 中新加入的关键词 init,record,with

    C# 9 中新加入的关键词 init,record,with

    这篇文章主要介绍了C# 9 中新加入的关键词 init,record,with的相关资料,帮助大家更好的理解和学习c# 9,感兴趣的朋友可以了解下...

    一线码农5512022-10-08
  • C#c# 实现简单的串口通讯

    c# 实现简单的串口通讯

    这篇文章主要介绍了c# 如何实现简单的串口通讯,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下...

    月井石4372022-11-07