多层菜单的实现方案(含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 nodeListwhere 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><Menux: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.hqwc.cn/news/519290.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

事务控制失效的八种常见原因

一、非public修饰的方法 Transactional注解只能在在public修饰的方法下使用。 /*** 私有方法上的注解&#xff0c;不生效&#xff08;因私有方法Spring扫描不到该方法&#xff0c;所以无法生成代理&#xff09;*/ Transactional private boolean test() {//test code } 二、…

【Linux】权限管理(文件的访问者、类型和访问权限,chmod、chown、chgrp、umask,粘滞位)

目录 00.前言 01.文件访问者的分类 02.文件类型和访问权限 文件类型&#xff1a; 文件基本权限&#xff1a; 03.文件权限值的表示方法 04.访问权限的设置 &#xff08;1&#xff09;chmod &#xff08;2&#xff09;chown &#xff08;3&#xff09;chgrp &#xff0…

OpenHarmony教程指南—Ability的启动模式

介绍 本示例展示了在一个Stage模型中&#xff0c;实现standard、singleton、specified多种模式场景。 本实例参考开发指南 。 本实例需要使用aa工具 查看应用Ability 模式信息。 效果预览 使用说明 1、standard模式&#xff1a; 1&#xff09;进入首页&#xff0c;点击番茄…

阿珊详解Vue路由的两种模式:hash模式与history模式

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

JAVA缓存:小工具

一、google.guava 用到的包 <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>20.0</version><scope>compile</scope></dependency>写法 单位 代码 Component publi…

揭秘CPU可视化:探索计算机心脏的神秘之旅

在数字化飞速发展的今天&#xff0c;中央处理器&#xff08;CPU&#xff09;作为计算机的心脏&#xff0c;其复杂度和重要性不言而喻。 中央处理器&#xff0c;这个小小的芯片&#xff0c;却承载着计算机运行的所有指令和数据处理任务。它的内部构造复杂而精密&#xff0c;每一…

阿珊解说Vue中`$route`和`$router`的区别

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

C++之类(一)

1&#xff0c;封装 1.1 封装的引用 封装是C面向对象三大特性之一 封装的意义&#xff1a; 将属性和行为作为一个整体&#xff0c;表现生活中的事物 将属性和行为加以权限控制 1.1.1 封装意义一&#xff1a; 在设计类的时候&#xff0c;属性和行为写在一起&#xff0c;表…

spring整合Junit , Spring整合mybatis

1.spring整合Junit 1.1导入Junit坐标 1.2在test.java文件新建测试文件,开始整合

ChaosBlade故障注入工具--cpu,内存,磁盘占用\IO,网络注入等

前言&#xff1a; 本文介绍一款开源的故障注入工具chaosblade&#xff0c;该工具原本由阿里研发&#xff0c;现已开源&#xff1b;工具特点&#xff1a;功能强大&#xff0c;使用简单。 该工具故障注入包含&#xff1a;cpu&#xff0c;内存&#xff0c;磁盘io&#xff0c;磁盘…

Spring源码:手写AOP

文章目录 一、概念1、AOP是什么&#xff1f;2、相关概念1&#xff09;目标对象Target2&#xff09;通知Advice3&#xff09;连接点Joinpoint4&#xff09;切点Pointcut5&#xff09;切面Aspect6&#xff09;织入Weaving 二、分析三、实现1、实现Advice1&#xff09;前置通知2&a…

Linux系统的进程,看完它,相信你想kill“it“就kill“it“o((>ω< ))o

Linux系统的进程 众所周知&#xff0c;不管在什么系统中&#xff0c;进程和线程都是操作系统中高并发处理中产生了重要的作用。Linux作为一个操作系统&#xff0c;也必须要拥有这两者才可以进行高并发。 进程是资源分配的最小单位。每一个进程都是相互独立的&#xff0c;不管是…