首页 > 其他分享 >如何在WPF中使用MVVM实现TreeView的层级显示

如何在WPF中使用MVVM实现TreeView的层级显示

时间:2022-11-08 11:59:10浏览次数:66  
标签:层级 string MVVM List RaiseChange WPF TreeView public

最近在写一个小工具的时候,遇到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 
 7         public string Level1Item
 8         {
 9             get => level1Item;
10             set
11             {
12                 level1Item = value;
13                 RaiseChange("Level1Item");
14             }
15         }
16 
17         private List<Level2> level1ChildList = new List<Level2>();
18 
19         public List<Level2> Level1ChildList
20         {
21             get => level1ChildList;
22             set
23             {
24                 level1ChildList = value;
25                 RaiseChange("Level1ChildList");
26             }
27         }
28 
29         public Level1(string item)
30         {
31             //构建测试数据
32             level1Item = item;
33             for(int i = 0;i<3;i++)
34             {
35                 level1ChildList.Add(new Level2($"层级2项目@{i}"));
36             }
37         }
38     }
39 
40     public class Level2 : ViewModelBase
41     {
42         private string level2Item = "";
43 
44         public string Level2Item
45         {
46             get => level2Item;
47             set
48             {
49                 level2Item = value;
50                 RaiseChange("Level2Item");
51             }
52         }
53 
54         private List<Level3> level2ChildList = new List<Level3>();
55 
56         public List<Level3> Level2ChildList
57         {
58             get => level2ChildList;
59             set
60             {
61                 level2ChildList = value;
62                 RaiseChange("Level2ChildList");
63             }
64         }
65 
66         public Level2(string item)
67         {
68             //构建测试数据
69             level2Item = item;
70             for (int i = 0; i < 3; i++)
71             {
72                 level2ChildList.Add(new Level3($"层级3项目@{i}"));
73             }
74         }
75     }
76 
77     public class Level3 : ViewModelBase
78     {
79         private string level3Item = "";
80 
81         public string Level3Item
82         {
83             get => level3Item;
84             set
85             {
86                 level3Item = value;
87                 RaiseChange("Level3Item");
88             }
89         }
90 
91         public Level3(string item)
92         {
93             //构建测试数据
94             level3Item = item;      
95         }
96     }
97 }

 

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

 1 public class MainWindowViewModel : ViewModelBase
 2     {
 3         private List<Level1> hierarchicalTestList = new List<Level1>();
 4 
 5         public List<Level1> 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  <TreeView ItemsSource="{Binding HierarchicalTestList}">

 

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

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

<TreeView.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding Level1ChildList}" DataType="{x:Type local:Level1}">
                    <Label Content="{Binding Level1Item}"/>
                    <HierarchicalDataTemplate.ItemTemplate>
                        <HierarchicalDataTemplate ItemsSource="{Binding Level2ChildList}" DataType="{x:Type local:Level2}">
                            <Label Content="{Binding Level2Item}"/>
                            <HierarchicalDataTemplate.ItemTemplate>
                                <DataTemplate DataType="{x:Type local:Level3}">
                                    <Label Content="{Binding Level3Item}"/>
                                </DataTemplate>
                            </HierarchicalDataTemplate.ItemTemplate>
                        </HierarchicalDataTemplate>
                    </HierarchicalDataTemplate.ItemTemplate>
                </HierarchicalDataTemplate>
            </TreeView.ItemTemplate>

 

6.运行效果

 

 

示例代码

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

标签:层级,string,MVVM,List,RaiseChange,WPF,TreeView,public
From: https://www.cnblogs.com/zhaotianff/p/16869172.html

相关文章

  • 【炫丽】从0开始做一个WPF+Blazor对话小程序
    大家好,我是沙漠尽头的狼。.NET是免费,跨平台,开源,用于构建所有应用的开发人员平台。本文演示如何在WPF中使用Blazor开发漂亮的UI,为客户端开发注入新活力。注要使WPF支......
  • 在WPF中用DataGrid实现表格样式
    资源文件定义颜色及样式<SolidColorBrushx:Key="TextColorGeneral"Color="#a2a2a2"/><StyleTargetType="DataGridColumnHeader"><SetterProperty="Horizon......
  • WPF 自定义控件 动画仪表盘控件 Gauge
    原文网址:https://blog.csdn.net/weixin_42850577/article/details/124008594WPF自制动画仪表盘控件Gauge  Xaml代码:<StyleTargetType="{x:Typectrl:ArcGauge......
  • 了解一下MVVM的优点有哪些?你知道吗?
    (MVVM的优点和缺点)什么是MVVM?MVVM(Model-View-ViewModel子控件的事件驱动模型),也就是轻量级的控制器架构。它本质上就是MVC的改进版。MVVM就是将其中的View的状态和行为......
  • 【WPF】ConfigurationManager连接sqlite数据库
     提供对客户端应用程序配置文件的访问。此类不能被继承。1、引用ConfigurationManager在Nuget引入ConfigurationManager。usingSystem.Configuration;  2、添......
  • wpf
    目录学习之因学习资料学习坎坷MyApp.txt(7,4):errorCS0012:类型“Enum”在未引用的程序集中定义。必须添加对程序集“System.Runtime,Version=6.0.0.0,Culture=neutra......
  • wpf VS2017 带图片显示的自定义Combox
    先看下效果图  思路大概是将ComboxItem分为4列,然后将下拉框选中的值设置到Combox中首先新建一个wpf的工程,取名为PictureCombox1.添加需要用的png图,先导入图片两张,取......
  • WPF XAML 中参数化构造函数赋值 DataContext
    引入命名空间:xmlns:system="clr-namespace:System;assembly=mscorlib"XAML:<Windowx:Class="WpfApp.MainWindow"xmlns="http://schemas.microsoft.com/winfx......
  • C# 窗体传值,TreeView To TreeView
      usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.T......
  • WPF 的 FlowDocumentScrollViewer滚动到最底下的方法
    官网上好像并没有直接给相应的接口和方法。发现一种有效的方法:先说方法:ScrollViewersv=flowScrollViewer.Template.FindName("PART_ContentHost",flowScrollViewer)......