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

news2024/10/25 9:26:35

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就是独立于这个集合的,检测到合适就起作用

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NCDA设计大赛中设定画命题解读

一年一度的未来设计师全国高校数字艺术设计大赛&#xff08;NCDA&#xff09;正在如火如荼的进行中&#xff0c;各高校的大学生和指导老师们也都在着手准备中。今天我们就特地来说说它的数字绘画命题之一的设定画选项&#xff0c;为了使大家更好地参加本次比赛&#xff0c;本文…

博客系统测试

文章目录 1.项目背景介绍2.功能介绍3.手动测试3.1编写测试用例3.2项目测试3.2.1登录测试3.2.2查看详情页面3.2.3编辑页面3.2.4删除博客3.2.5注销用户 大家好&#xff0c;我是晓星航。今天为大家带来的是 博客系统测试 相关的讲解&#xff01;&#x1f600; 1.项目背景介绍 项…

Vue.js+SpringBoot开发农村物流配送系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统登录、注册界面2.2 系统功能2.2.1 快递信息管理&#xff1a;2.2.2 位置信息管理&#xff1a;2.2.3 配送人员分配&#xff1a;2.2.4 路线规划&#xff1a;2.2.5 个人中心&#xff1a;2.2.6 退换快递处理&#xff1a;…

DxO ViewPoint:摄影师的最 佳拍档,记录世界的每一刻精彩 mac/win版

DxO ViewPoint是一款革命性的摄影软件&#xff0c;它以其独特的功能和卓越的性能&#xff0c;重新定义了摄影体验。这款软件不仅提供了丰富的摄影工具&#xff0c;还通过先进的算法和技术&#xff0c;让摄影师能够轻松捕捉、管理和展示他们的作品。 DxO ViewPoint 软件获取 Dx…

《幸运的基督徒》Python

题目描述 有15个基督徒和15个非基督徒在海上遇险&#xff0c; 为了能让一部分人活下来不得不将其中15个人扔到海里面去&#xff0c; 有个人想了个办法就是大家围成一个圈&#xff0c;由某个人开始从1报数&#xff0c; 报到9的人就扔到海里面&#xff0c;他后面的人接着从1开始报…

unity学习(49)——服务器三次注册限制以及数据库化角色信息4--角色信息数据库化

1.此处下断开始调试,list函数内就有问题&#xff1a; 2. 现在的问题是只读不写&#xff01;32行就是写入部分的代码&#xff1a; 3. 很奇怪&#xff0c;调试的时候确实是写进来了 程序正常执行后&#xff0c;文件中数据也没有消失 关闭服务器文件内容依旧正常。 players包含所…

px2rem实现vue项目响应式布局

第一步 首先需要在项目中安装px2rem插件 npm install postcss-px2rem px2rem-loader --save 第二步 在项目src目录下新建util文件夹&#xff0c;在util文件夹下新建rem.js文件&#xff0c;内容如下&#xff1a; // rem等比适配配置文件 // 基准大小 const baseSize 14 //…

day14_异常

今日内容 零、 复习昨日 一、日期类 二、异常 零、 复习昨日 1为什么要重写toString Object类toString返回的是对象名字地址,无意义子类重写toString() 返回的对象属性内容 2为什么要重写equals Object类equals判断是对象的地址值是否相等,无意义子类重写equals,为了判断对象的…

电商分享沙龙干货:做印尼电商如何提高顾客购买意愿?

“得印尼者得东南亚” 这是诸多在印尼掘金的电商人的共识。2.7亿人口、GDP年增速稳定在5%、平均年龄在30岁上下、较强的消费能力……这些都使得印尼成为电商人掘金东南亚的首选之地。 图源&#xff1a;freepik 但近几年来&#xff0c;印尼政府不断调整关税&#xff0c;限制电商…

SAP MM学习笔记 - 错误 BMG140 - The material number is longer than the length set

错误 BMG140 - The material number is longer than the length set 品目编号大于长度设置 1&#xff0c;在新规品目的时候&#xff0c;出的错 2&#xff0c;OMSL 品目Code书式变更 IMG path>Logistic general>Material Master>Basic settings>Define output for…

滴滴基于 Clickhouse 构建新一代日志存储系统

ClickHouse 是2016年开源的用于实时数据分析的一款高性能列式分布式数据库&#xff0c;支持向量化计算引擎、多核并行计算、高压缩比等功能&#xff0c;在分析型数据库中单表查询速度是最快的。2020年开始在滴滴内部大规模地推广和应用&#xff0c;服务网约车和日志检索等核心平…

电脑自带dll修复在哪里,dll修复工具一键修复dll丢失问题

xinput1_3.dll文件是一个Windows操作系统中的动态链接库&#xff08;DLL&#xff09;文件&#xff0c;它是微软DirectX软件开发包的一部分&#xff0c;主要用于支持游戏控制器和其他输入设备的交互。这个文件是DirectInput API的一个组件&#xff0c;DirectInput是DirectX中处理…

聚焦两会 | 从2024年政府工作报告看网络安全新机

在今年的《政府工作报告》&#xff08;下面简称“报告”&#xff09;中&#xff0c;除了对2023年里我国所取得的重大成就作了全面总结外&#xff0c;针对2024年全年经济社会发展作出的部署安排引起全国人民的关注。报告中与网络安全相关的内容也引起网络安全行业相关从事人员的…

wpf prism左侧抽屉式菜单

1.首先引入包MaterialDesignColors和MaterialDesignThemes 2.主页面布局 左侧菜单显示在窗体外&#xff0c;点击左上角菜单图标通过简单的动画呈现出来 3.左侧窗体外菜单 <Grid x:Name"GridMenu" Width"150" HorizontalAlignment"Left" Ma…

TypeScript 中类、接口、枚举、函数、命名空间与模块的理解?应用场景?

文章目录 类、接口、枚举定义使用方式**1. 类**继承修饰符私有修饰符受保护修饰符只读修饰符 静态属性抽象类 接口 interface枚举 enum数字枚举字符串枚举异构枚举本质 函数function可选参数剩余类型函数重载 模块命名空间命名空间与模块区别应用场景有需要的请私信博主&#x…

php安装kafka

我的开发环境是php7.3 ,先来部署两个php扩展&#xff0c;php7.3目录下放librdkafka.dll,ext/php_rdkafka.dll&#xff0c;php.ini增加,[rdkafka] extension php_rdkafka.dll php7.3对应的扩展包链接&#xff1a;PECL :: Package :: rdkafka 看自己php版本对应在这里找PECL :: …

java 获取项目内的资源/配置文件

【getResourceAsStream】是java中用于获取项目内资源的常用方法&#xff0c;能够返回一个数据流&#xff0c;从而允许我们读取指定路径下的资源文件。这个方法可以用来读取各种类型的资源文件&#xff0c;包括但不限于文本文件、图像文件、配置文件等。 要使用getResourceAsStr…

论文阅读_世界模型

1 2 3 4 5 6 7 8英文名称: World Models 中文名称: 世界模型 链接: https://arxiv.org/abs/1803.10122 示例: https://worldmodels.github.io/ 作者: David Ha, Jurgen Schmidhuber 机构: Google Brain, NNAISENSE, Swiss AI Lab, IDSIA (USI & SUPSI) 日期: 27 Mar 2018 引…

基于Llama 2家族的提示词工程:Llama 2 Chat, Code Llama, Llama Guard

Prompt Engineering with Llama 2 本文是学习 https://www.deeplearning.ai/short-courses/prompt-engineering-with-llama-2/ 的学习笔记。 文章目录 Prompt Engineering with Llama 2What you’ll learn in this course [1] Overview of Llama Models[2] Getting Started wi…

基于docker安装的Jenkins实现python执行自动化测试程序

背景 通过Jenkins实现自动化测试,在全局配置中配置好后,执行构建发生如下错误 解决办法: 在Jenkins中插件管理中下载python后,回到Jenkins容器中 查找刚下载的python所在位置 到Jenkins中全局配置中修改脚本 1.可以在环境变量中定义python所在位置 2.在一下图示中进行获取…