新手入门WPF之TreeView控件(一)

这篇具有很好参考价值的文章主要介绍了新手入门WPF之TreeView控件(一)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

刚接触C#没多久,学着用C#中的WPF做 一些界面,所以本篇文章适合初学者看,这次我主要介绍的是在项目中经常用到的一个WPF控件——TreeView。

TreeView也就是目录树,先给出一个最简单的展示效果及代码

这是刚创建的一个名为BeginTreeView的解决项目(使用的VS2022)

新手入门WPF之TreeView控件(一)

 把它改为下图(把Grid布局控件换为TreeView),添加的代码如下:

新手入门WPF之TreeView控件(一)

    <TreeView>
        <TreeViewItem Header="第一级">
            <TreeViewItem Header="第二级">
                <TreeViewItem Header="第三级"/>
            </TreeViewItem>
        </TreeViewItem>
        <TreeViewItem Header="第一级"/>
        <TreeViewItem Header="第一级"/>
        <TreeViewItem Header="第一级"/>
    </TreeView>

运行后的结果如图所示(一个三级树):

新手入门WPF之TreeView控件(一)

 当然,这种写法在实战项目上是没用的,一般来说,树的生成是根据读取所提供的数据动态的生成的,因此,现在的思路是要实现由数据动态生成树,首先想到的是在TreeView中创建TreeViewItem的模板,通过模板与数据的绑定,动态生成所需要的树,而我在项目上,一般是使用TreeView中的——HierarchicalDataTemplate对象设置TreeView.ItemTemplate属性(至于为什么一般不用DataTemplate,我会在文章最后补充中进行说明),修改代码如下:

    <TreeView>
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate>
                <TextBlock/>
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>

新手入门WPF之TreeView控件(一)

完成后,接下来的任务就是让数据与模板进行绑定,这时用到了TreeView中的ItemSource属性,该属性需要注意的是,绑定的数据需要是列表类型的数据,不是C#中的基本数据类型。好了,既然TreeViewItem数据源有了,那么最后一步就是让TreeViewItem中显示数据源中的什么数据,这也就是TextBlock的作用,不过千万别忽悠一个问题,读数据或者生成数据,是需要对应的结构,没有结构的数据是没办法利用的,所以我们需要先自定义一个数据结构,下图是我定义的一个简单结构(项目结构调整如左边——MVVM)

新手入门WPF之TreeView控件(一)

    internal class TreeViewModel
    {
        public string? Name { get; set; }

        public ObservableCollection<TreeViewModel> Children { get; set; } = new ObservableCollection<TreeViewModel>();
    }

之后在ViewModel中添加如下代码

    internal class TreeViewViewModel
    {
        private TreeViewModel _treeViewModel = new TreeViewModel();

        public TreeViewModel TreeViewModel
        {
            get { return _treeViewModel; }
            set { _treeViewModel = value; }
        }

        public TreeViewViewModel()
        {
            InitTree();
        }
        public void InitTree()
        {
            for (int i = 0; i < 5; i++)
            {
                TreeViewModel treeViewModel = new TreeViewModel();
                treeViewModel.Name = $"第{i + 1}级";
                for (int j = 0; j < 5; j++)
                {
                    TreeViewModel treeViewModel1 = new TreeViewModel();
                    treeViewModel1.Name = $"第{i + 1}----{j + 1}级";
                    treeViewModel.Children.Add(treeViewModel1);
                }
                TreeViewModel.Children.Add(treeViewModel);
            }

        }
    }

最后,就是对生成数据的绑定,代码如下

新手入门WPF之TreeView控件(一)

    <Window.DataContext>
        <viewModel:TreeViewViewModel x:Name="viewmodel"/>
    </Window.DataContext>

    <TreeView ItemsSource="{Binding TreeViewModel.Children}">
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding Children}">
                <TextBlock Text="{Binding Name}"/>
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>

注:由于采用的是MVVM,所以在前端需要绑定ViewModel,这样才能访问到后台生成的数据并操作数据

xmlns:viewModel="clr-namespace:BeginTreeView.ViewModel"

运行的结果如图所示,是一个2级树

新手入门WPF之TreeView控件(一)

 补充:HierarchicalDataTemplate对象与DataTemplate对象之间的区别

HierarchicalDataTemplate相比DataTemplate有一个额外的优点,就是封装第二个模板。然后HierarchicalDataTemplate对象就可以从第一层数据中提取项的集合,并将之提供给第二个模板。

举个例子:假如项目中给的数据结构是定死的,而且数据结构不是同对象递归,这时就需要这样生成树。

在原来的解决方案上修改数据结构如下所示

新手入门WPF之TreeView控件(一)

    public class TreeViewModel
    {
        public ObservableCollection<TreeNodeViewModel1> ChildrenModel1 { get; set; } = new ObservableCollection<TreeNodeViewModel1>();
    }

    public class TreeNodeViewModel1
    {
        public string? Name { get; set; }

        public ObservableCollection<TreeNodeViewModel2> ChildrenModel2 { get; set; } = new ObservableCollection<TreeNodeViewModel2>();
    }

    public class TreeNodeViewModel2
    {
        public string? ID { get; set; }

        public ObservableCollection<TreeNodeViewModel3> ChildrenModel3 { get; set; } = new ObservableCollection<TreeNodeViewModel3>();

    }

    public class TreeNodeViewModel3
    {
        public string? Description { get; set; }
    }

 之后在ViewModel中修改创建数据的代码(InitTree方法)如下

新手入门WPF之TreeView控件(一)

            TreeViewModel treeViewModel = new TreeViewModel();

            for (int i = 0; i < 5; i++)
            {
                TreeNodeViewModel1 treeViewModel1 = new TreeNodeViewModel1();
                treeViewModel1.Name = $"第{i + 1}级";

                for (int j = 0; j < 5; j++)
                {
                    TreeNodeViewModel2 treeNodeViewModel2 = new TreeNodeViewModel2();
                    treeNodeViewModel2.ID = $"我的ID是:{j + 1}";

                    for (int k = 0; k < 5; k++)
                    {
                        TreeNodeViewModel3 treeNodeViewModel3 = new TreeNodeViewModel3();
                        treeNodeViewModel3.Description = $"我是最后{k + 1}";
                        treeNodeViewModel2.ChildrenModel3.Add(treeNodeViewModel3);
                    }
                    treeViewModel1.ChildrenModel2.Add(treeNodeViewModel2);
                }
                treeViewModel.ChildrenModel1.Add(treeViewModel1);
            }
            TreeViewModel = treeViewModel;

最后在前端绑定数据源与模板,如下图所示

新手入门WPF之TreeView控件(一)

    <TreeView ItemsSource="{Binding TreeViewModel.ChildrenModel1}">
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding ChildrenModel2}">
                <TextBlock Text="{Binding Name}"/>
                <HierarchicalDataTemplate.ItemTemplate >
                    <HierarchicalDataTemplate ItemsSource="{Binding ChildrenModel3}">
                        <TextBlock Text="{Binding ID}"/>
                        <HierarchicalDataTemplate.ItemTemplate >
                            <DataTemplate>
                                <TextBlock Text="{Binding Description}"/>
                            </DataTemplate>
                        </HierarchicalDataTemplate.ItemTemplate>
                    </HierarchicalDataTemplate>
                </HierarchicalDataTemplate.ItemTemplate>
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>

运行后的结果图,是一个3级树

新手入门WPF之TreeView控件(一)

本篇文章到此结束,谢谢各位耐心阅读,后续将讲述增删改查等功能实现 

第一次写博客,希望各位大佬批评指正新手入门WPF之TreeView控件(一)文章来源地址https://www.toymoban.com/news/detail-444273.html

到了这里,关于新手入门WPF之TreeView控件(一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • PyCharm新手入门指南

    PyCharm新手入门指南

    安装好Pycharm后,就可以开始编写第一个函数:Hello World啦~我们就先来学习一些基本的操作,主要包含新建Python文件,运行代码,查看结果等等。 文章主要包含五个部分: 一、界面介绍 主要分为菜单栏、项目目录、编辑区域、终端区和运行/调试代码区域。 1、菜单栏:一些新

    2024年02月13日
    浏览(15)
  • Midjourney新手入门指南

    Midjourney新手入门指南

    我们来看一下百度百科的回复 是不是有点蒙,没关系,一句话概括:用描述来生成图像的AI工具。 你可能又有一门了,discord是什么?为什么要下载它?我们来看看百度百科 原因:Midjouney 没有自己的客户端,它是搭载在Discord上。 Discord 简单来说,就是一个聊天应用。

    2024年02月10日
    浏览(15)
  • HLS新手入门教程

    HLS新手入门教程

    HLS是一种高级综合技术,它允许开发人员使用高级语言(如C、C++和SystemC)来描述数字电路的行为和功能,然后将其转换为硬件电路实现。这种转换过程是自动完成的,因此开发人员无需手动编写硬件描述语言(HDL)。 HLS的主要目的是简化FPGA设计流程,提高设计效率和设计质

    2024年02月02日
    浏览(15)
  • 新手入门Jenkins自动化部署入门详细教程

    新手入门Jenkins自动化部署入门详细教程

    在实际开发中,我们经常要一边开发一边测试,当然这里说的测试并不是程序员对自己代码的单元测试,而是同组程序员将代码提交后,由测试人员测试; 或者前后端分离后,经常会修改接口,然后重新部署; 这些情况都会涉及到频繁的打包部署; 手动打包常规步骤: 1.提

    2024年02月13日
    浏览(15)
  • StarkNet新手入门教程:教你用bitget 钱包入门

    StarkNet新手入门教程:教你用bitget 钱包入门

    理想的Starknet (web3.bitget.com/zh/assets/starknet-wallet) 钱包取决于个人喜好,同时考虑安全性、用户友好性、帐户恢复选项和多通证支持等因素。尽管如此,无论您使用 Starknet (STRK) 的目的是持有还是交易,Bitget Wallet 都是您管理 STRK 以及其他以太坊和 Optimism 加密资产的理想钱包选择

    2024年03月12日
    浏览(14)
  • STEPN 新手入门及进阶

    STEPN 新手入门及进阶

    先上STEPN中文白皮书 STEPN中文白皮书-V2.3 截至2月19日 - 知乎 大神的作品,官翻级别译本。 https://zhuanlan.zhihu.com/p/467799815 从0到第一次跑步 第一步 下载STEPN APP 苹果手机需要切到非大陆区的苹果商店,比如美区账号。具体账号可以直接去淘宝搜美区苹果购买,一般不到10块钱吧。

    2023年04月08日
    浏览(10)
  • 【Linux】Git - 新手入门

    【Linux】Git - 新手入门

    版本控制: 我们写的代码不是一成不变的,往往需要经过多次修改 但是可能会有一些尴尬的问题:比如我把代码改了,发现 bug 更多了,之前的代码也找不到了,怎么办? 难道每次写代码之前,我都要自己先备份一遍吗?这也太麻烦了 有没有一种工具可以自动帮我保存每次

    2024年01月15日
    浏览(24)
  • Linux新手入门必备------基本指令

    目录 一、获取帮助信息 1、man指令 2、help指令 3、常用快捷键 二、文件目录类 1、pwd 显示当前工作目录的绝对路径 2、ls 列出目录的内容 3、cd 切换目录 4、mkdir 创建一个新文件目录 5、touch 创建空文件 6、cp 复制文件或目录 7、rm / rmdir 删除文件或目录 8、mv 移动文件与目录或重

    2024年02月05日
    浏览(11)
  • 【Matlab编程】新手入门第五天

    【Matlab编程】新手入门第五天

    在MATLAB中除了能够进行数值、矩阵运算外,还可以进行各种各样的符号计算。 MATLAB数值运算的对象是数值,而符号运算的对象是非数值的符号对象。符号对象就是代表非数值的符号字符串。 符号对象是定义的一种新的数据类型(sym类型)用来存储非数值的字符符号。在MATLAB中,

    2024年02月04日
    浏览(4)
  • Ajax超详解(新手入门指南)

    Ajax超详解(新手入门指南)

    AJAX:全称是 Asynchronous JavaScript And XML ,即异步的JavaScript和XML。AJAX是用于前后端交互的工具,也就是说通过AJAX作为桥梁,客户端可以给服务端发送消息,也可以接收服务端的响应消息。 AJAX的两种实现方式: XHR :使用XMLHttpRequest对象来实现AJAX Fetch :使用Fetch API来实现AJAX X

    2023年04月25日
    浏览(21)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包