多层菜单的实现方案(含HierarchicalDataTemplate使用)

1、递归

        下面是Winform的递归添加菜单栏数据,数据设置好父子id方便递归使用

在TreeView的控件窗口加载时,调用递归加载菜单

private void LoadTvMenu()
        {
            this.nodeList = objService.GetAllMenu();    // 通过Service得到全部数据

            // 创建一个根节点
            this.tv_MenuList.Nodes.Clear(); // 亲空所有节点
            // 这个是TreeView的节点
            TreeNode rootNode = new TreeNode();
            rootNode.Text = "学员管理系统";
            rootNode.Tag = "0"; // 暂时没什么用
            rootNode.ImageIndex = 0;    // 设置根节点现实的图片
            this.tv_MenuList.Nodes.Add(rootNode);   // 将根节点添加到treeview根节点

            // 基于递归方式添加所有子节点
            CreateChildNode(rootNode, "0");
        }


        private void CreateChildNode(TreeNode parentNode, string preId)
        {
            var nodes = from list in nodeList
                        where list.ParentId.Equals(preId)
                        select list;

            foreach (var item in nodes)
            {
                TreeNode node = new TreeNode();
                node.Text = item.MenuName;
                node.Tag = item.MenuCode;

                // 设置节点图表
                if (item.ParentId == "0")
                {
                    node.ImageIndex = 1;
                }
                else
                {
                    node.ImageIndex = 3;
                }

                parentNode.Nodes.Add(node); // 给父节点添加上这个子节点

                // 递归调用
                CreateChildNode(node, item.MenuId.ToString());
                this.tv_MenuList.Nodes[0].Expand(); // 将一级目录全部展开
                this.tv_MenuList.ExpandAll();
            }
        }

在WPF中也是差不多的可以用递归实现加载TreeView

2、WPF中可以使用HierarchicalDataTemplate非常方便

 创建数据类

public class ListLeagueList : ObservableCollection<League>
{
    List<League> leagues = new List<League>();
    List<Division> divisions = new List<Division>();
    List<Team> teams = new List<Team>();

    public ListLeagueList()
    {
        teams.Add(new Team() { Name = "Team 1" });
        teams.Add(new Team() { Name = "Team 2" });
        teams.Add(new Team() { Name = "Team 3" });
        teams.Add(new Team() { Name = "Team 4" });

        divisions.Add(new Division() { Name = "Division 1", Teams = teams });
        divisions.Add(new Division() { Name = "Division 2", Teams = teams });
        divisions.Add(new Division() { Name = "Division 3", Teams = teams });

        Add(new League() { Name = "League a", Divisions = divisions });
        Add(new League() { Name = "League b", Divisions = divisions });
        Add(new League() { Name = "League c", Divisions = divisions });
    }
}

 view中        设置下一个子集合为ItemsSource

<DockPanel>
    <DockPanel.Resources>
        <local:ListLeagueList x:Key="myList" />
        <HierarchicalDataTemplate DataType="{x:Type models:League}" ItemsSource="{Binding Divisions}">
            <TextBlock Text="{Binding Path=Name}" />
        </HierarchicalDataTemplate>
        <HierarchicalDataTemplate DataType="{x:Type models:Division}" ItemsSource="{Binding Teams}">
            <TextBlock Text="{Binding Path=Name}" />
        </HierarchicalDataTemplate>
        <!--  最后一个没有ItemsSource  -->
        <HierarchicalDataTemplate DataType="{x:Type models:Team}">
            <TextBlock Text="{Binding Path=Name}" />
        </HierarchicalDataTemplate>
    </DockPanel.Resources>


    <Menu
        x:Name="menu1"
        Margin="10"
        DockPanel.Dock="Top">
        <MenuItem Header="我的足球联赛" ItemsSource="{Binding Source={StaticResource myList}}" />
    </Menu>

    <TreeView x:Name="treeView1">
        <TreeViewItem Header="我的足球联赛" ItemsSource="{Binding Source={StaticResource myList}}" />
    </TreeView>

</DockPanel>

使用HierarchDataTemplate后可以显示多层的控件都可以使用

-- 这里的ItemsSource是集合,使用其它方式绑定上也是一样的;HierarchicalDataTemplate就是独立于这个集合的,检测到合适就起作用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/437335.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Salesforce 2024财年爆发式增长!第一次现金分红

对于Salesforce来说&#xff0c;这是非凡的转型之年&#xff0c;所有的关键指标都表现强劲&#xff0c;现金流和利润增长创下了纪录。截至第四季度末&#xff0c;Salesforce的剩余履约价值&#xff08;RPO&#xff09;总额为569亿美元&#xff0c;同比增长17%。 Marc Benioff …

Unity引擎关于APP后台下载支持的实现问题

1&#xff09;Unity引擎关于APP后台下载支持的实现问题 2&#xff09;Prefab对DLL中脚本的引用丢失 3&#xff09;Unity DOTS资源加载问题 4&#xff09;UnitySendMessage和_MultiplyMatrixArrayWithBase4x4_NEON调用导致崩溃 这是第376篇UWA技术知识分享的推送&#xff0c;精选…

一文彻底搞懂从输入URL到显示页面的全过程

简略版&#xff1a; 用户输入URL后&#xff0c;浏览器经过URL解析、DNS解析、建立TCP连接、发起HTTP请求、服务器处理请求、接收响应并渲染页面、关闭TCP连接等步骤&#xff0c;最终将页面显示给用户。 详细版&#xff1a; URL解析&#xff1a;浏览器根据用户输入的URL&#x…

字符函数

1.字符分类函数 专门做字符分类的函数&#xff0c;都包含一个头文件#include <ctype.h> islower() 是一个用于判断字符是否为小写字母的函数。 通常情况下&#xff0c;如果一个字符是小写字母&#xff0c;则 islower() 函数会返回 true 或者一个表示真的值&#xff08…

STM32标准库——(19)PWR电源控制

1.PWR简介 PWR属于外设部分 调用时需要先开启时钟 2.电源框图 这个图可以分为三个部分&#xff0c;最上面是模拟部分供电叫做VDDA&#xff0c;中间是数字部分供电&#xff0c;包括两块区域&#xff0c;VDD供电区域和1.8v供电区域&#xff0c;下面是后备供电&#xff0c;叫做VB…

VM 虚拟机 ubuntu 解决无法连接网络问题

添加网卡法 就是在虚拟机的设置那里多增加一个网卡

python小白考教资(教资中的简单编程)

首先&#xff0c;写习惯了c语句的我&#xff08;虽然也会一丢丢&#xff09;&#xff0c;当然得深知python与C语言的一些简单的语句区别&#xff0c;这里为什么我要学习python呢&#xff0c;因为有些题目&#xff0c;python一句话就可以解决&#xff0c;但是以我的水平&#xf…

数据结构:AVL树

目录 1、AVL树的概念 2、二叉搜索树的功能与实现 1、AVL树节点定义 2、AVL树的插入 3、AVL树的旋转操作 1、左旋 2、右旋 3、左右旋 4、右左旋 3、AVL树完整代码实现 1、AVL树的概念 在前面的文章中&#xff0c;我们学过了二叉搜索树&#xff0c;二叉搜索树虽可以缩短查…

论文阅读_解释大模型_语言模型表示空间和时间

英文名称: LANGUAGE MODELS REPRESENT SPACE AND TIME 中文名称: 语言模型表示空间和时间 链接: https://www.science.org/doi/full/10.1126/science.357.6358.1344 https://arxiv.org/abs/2310.02207 作者: Wes Gurnee & Max Tegmark 机构: 麻省理工学院 日期: 2023-10-03…

142.乐理基础-音程的构唱练习

内容参考于&#xff1a;三分钟音乐社 上一个内容&#xff1a;141.乐理基础-男声女声音域、模唱、记谱与实际音高等若干问题说明-CSDN博客 本次内容最好去看视频&#xff1a; https://apphq3npvwg1926.h5.xiaoeknow.com/p/course/column/p_5fdc7b16e4b0231ba88d94f4?l_progra…

Python变量类型常用的函数【函数】

一、Python Number(数字)常用的函数 主要有math模块和cmath模块。 math模块&#xff1a;提供了许多对浮点数的数学运算函数。 cmath模块&#xff1a;提供了一些用于复数运算的函数。 使用两个模块里的函数时要先导入&#xff1a; import math查看math模块里的函数&#xff1a…

ky10 server 离线编译安装nginx

代码地址 https://gitcode.net/zengliguang/linux_video_audio_nginx_proxy.git 下载代码 查看服务器上下载的代码 编译安装 进入代码路径 cd /root/linux_video_audio_nginx_proxy 执行离线编译安装脚本 source centos7_nginx_offline_comp_install.sh安装编译相关依赖 …

SystemVerilog构造、包

包 包提供了一种共享不同构造的附加方式。他们的行为与VHDL包。包可以包含函数、任务、类型和枚举。的语法包是&#xff1a; package package_name; items endpackage : package_name 最终的package_name不是必需的&#xff0c;但它使代码更易于阅读。包是import命令在其他…

智慧城市中的数据力量:大数据与AI的应用

目录 一、引言 二、大数据与AI技术的融合 三、大数据与AI在智慧城市中的应用 1、智慧交通 2、智慧环保 3、智慧公共安全 4、智慧公共服务 四、大数据与AI在智慧城市中的价值 1、提高城市管理的效率和水平 2、优化城市资源的配置和利用 3、提升市民的生活质量和幸福感…

String类,StringBuilder类,StringBuffer类

前言 String类&#xff0c;StringBuilder类&#xff0c;StringBuffer类都是java提供的定义字符串的类&#xff0c;下面是三种字符串类的异同介绍 String类&#xff1a;String类表示的字符串是是常量&#xff0c;一旦创建内容和长度都无法修改 StringBuilder类&#xff1a;St…

3.7练习题解

一共五道题&#xff1a; 1. PERKET&#xff1a; 观察容易发现n的值很小&#xff0c;所以我们可以考虑使用dfs的方法进行解答&#xff0c;首先我们可以考虑一共有n种配料&#xff0c;那么我们就可以考虑到可以选择1到n种配料数目&#xff0c;然后基于这个思路我们再对其进行判断…

关于JVM的小总结(待补充)

JVM组成及他们之间的关系 装载类子系统字节码执行引擎运行时数据区 装载类子系统 类加载器字节码调节器类加载运行时数据区 字节码执行引擎 运行时数据区 线程私有 虚拟机栈本地方法栈程序计数器 线程共享 堆方法区&#xff08;元空间&#xff09;

C++的类和对象(四):拷贝构造函数

目录 拷贝构造函数 特性 自定义类型的传值传参和传引用传参对比 赋值运算符重载 拷贝构造函数 基本概念&#xff1a;只有单个形参&#xff0c;该形参是对本类类型对象的引用&#xff08;一般常用const修饰&#xff09;&#xff0c;在创建一个已存在对象一模一样的新对象时…

IDEA 配置文件乱码,项目编码设置

见下图 其中第一二项控制全局以及工程的编码格式&#xff0c;下方的则是 properties 配置文件的格式&#xff0c;统一调整为 UTF-8 后不再乱码

Java面试篇【并发编程】常见面试题(2024最新)

Java并发编程常见面试题 1.什么是线程和进程&#xff1f; 进程是操作系统分配资源的最小单位&#xff0c;各个进程之间占据独立的寻址空间&#xff0c;运行也是独立运行&#xff0c;进程间通信需要一些机制。进程间切换需要的开销较大。 线程是程序执行的基本单位&#xff0c…