• WPF MVVM实现TreeView层级显示


    最近在写一个小工具的时候,遇到TreeView的层级显示,刚好我又用了MVVM模式,所以这里做个总结。

    以前我是直接绑定XML数据到TreeView的,使用的XmlDataProvider,这次的数据是直接来自数据库的。

    用到的都是HierarchicalDataTemplate

    下面演示一下如何使用绑定实现TreeView的层级显示

    1.创建一个ViewModelBase类,实现INotifyPropertyChanged

    1   public class ViewModelBase : INotifyPropertyChanged
    2     {
    3         public event PropertyChangedEventHandler PropertyChanged;
    4 
    5         public void RaiseChange(string propertyName)
    6         {
    7             PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    8         }
    9     }

    2.创建模型

    这里我建立 了三个层级 的数据

    层级1包含了一个属性一个层级2列表

    层级2包含了一个属性一个层级3列表

    层级3包含了一个属性

    在构造函数中创建测试数据

    1. namespace MVVMTreeViewHierarchical
    2. {
    3. public class Level1 : ViewModelBase
    4. {
    5. private string level1Item = "";
    6. public string Level1Item
    7. {
    8. get => level1Item;
    9. set
    10. {
    11. level1Item = value;
    12. RaiseChange("Level1Item");
    13. }
    14. }
    15. private List level1ChildList = new List();
    16. public List Level1ChildList
    17. {
    18. get => level1ChildList;
    19. set
    20. {
    21. level1ChildList = value;
    22. RaiseChange("Level1ChildList");
    23. }
    24. }
    25. public Level1(string item)
    26. {
    27. //构建测试数据
    28. level1Item = item;
    29. for(int i = 0;i<3;i++)
    30. {
    31. level1ChildList.Add(new Level2($"层级2项目@{i}"));
    32. }
    33. }
    34. }
    35. public class Level2 : ViewModelBase
    36. {
    37. private string level2Item = "";
    38. public string Level2Item
    39. {
    40. get => level2Item;
    41. set
    42. {
    43. level2Item = value;
    44. RaiseChange("Level2Item");
    45. }
    46. }
    47. private List level2ChildList = new List();
    48. public List Level2ChildList
    49. {
    50. get => level2ChildList;
    51. set
    52. {
    53. level2ChildList = value;
    54. RaiseChange("Level2ChildList");
    55. }
    56. }
    57. public Level2(string item)
    58. {
    59. //构建测试数据
    60. level2Item = item;
    61. for (int i = 0; i < 3; i++)
    62. {
    63. level2ChildList.Add(new Level3($"层级3项目@{i}"));
    64. }
    65. }
    66. }
    67. public class Level3 : ViewModelBase
    68. {
    69. private string level3Item = "";
    70. public string Level3Item
    71. {
    72. get => level3Item;
    73. set
    74. {
    75. level3Item = value;
    76. RaiseChange("Level3Item");
    77. }
    78. }
    79. public Level3(string item)
    80. {
    81. //构建测试数据
    82. level3Item = item;
    83. }
    84. }
    85. }

    3.新建一个ViewModel类MainWindowViewModel,增加一个列表用于绑定,并构建测试数据列表。

     1 public class MainWindowViewModel : ViewModelBase
     2     {
     3         private List hierarchicalTestList = new List();
     4 
     5         public List HierarchicalTestList
     6         {
     7             get => hierarchicalTestList;
     8             set
     9             {
    10                 hierarchicalTestList = value;
    11                 RaiseChange("HierarchicalTestList");
    12             }
    13         }
    14 
    15         public MainWindowViewModel()
    16         {
    17             for (int i = 0; i < 3; i++)
    18             {
    19                 hierarchicalTestList.Add(new Level1($"层级1项目@{i}"));
    20             }
    21         }
    22     }

    设置Context

    1 public partial class MainWindow : Window
    2     {
    3         public MainWindow()
    4         {
    5             InitializeComponent();
    6             this.DataContext = new MainWindowViewModel();
    7         }
    8     }

    4.将TreeView的ItemSource绑定到MainWindowViewModel的HierarchicalTestList

    1  

    5.使用HierarchicalDataTemplate重新定义TreeView的ItemTemplate

    这里其实就是一级一级的定义,比如第一级,使用ItemSource绑定它的下一级列表,然后用一个Label显示当前层级要显示的数据。依次定义多级即可。

    
                    
                        
                

    6.运行效果

    示例代码

    说明:

    1.正式使用时,应该将List换成ObservableCollection

    2.如果绑定的数据为空,不会生成树节点,而不是生成一个空节点。所以这种方式适用于不规则的 数据。

  • 相关阅读:
    光敏传感器模块(YH-LDR)
    20个团建游戏
    Flink学习笔记(二):Flink内存模型
    Comparator和Comparable
    仿写muduo网络库:日志的简单实现
    [笔记] 函数sort() #排序
    音乐播放器蜂鸣器ROM存储歌曲verilog,代码/视频
    java this用法
    axios 实现请求重试
    Three.js 与 Python 语法 (PyWeb3D)
  • 原文地址:https://blog.csdn.net/zhaotianff/article/details/140948372