WPF TreeView 全选/反选/子级选中父级也选中

// TreeView 全选/反选/子级选中父级也选中

CSDN 下载链接

<TreeView Grid.Column="0" Grid.Row="1" Grid.ColumnSpan="2" Name="menuTree" Width="240" ItemsSource="{Binding MenuList}" BorderThickness="0" Background="#fff" HorizontalAlignment="Center" VerticalAlignment="Center"><TreeView.ItemTemplate><HierarchicalDataTemplate ItemsSource="{Binding Path=MenuChild}"><StackPanel><CheckBox Content="{Binding Path=menu.Header}" Margin="0,3"  x:Name="ckName" IsChecked="{Binding Path=IsSelect,Mode=TwoWay}"   Tag="{Binding Path=menu.HeaderCode}"  Checked="CkName_Checked" Unchecked="CkName_Unchecked"></CheckBox></StackPanel></HierarchicalDataTemplate></TreeView.ItemTemplate><TreeView.ItemContainerStyle><Style TargetType="{x:Type TreeViewItem}"><Setter Property="IsExpanded" Value="True"/><Setter Property="IsEnabled" Value="True"/></Style></TreeView.ItemContainerStyle></TreeView>
 /// <summary>/// 选中/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void CkName_Checked(object sender, RoutedEventArgs e){CheckBox ck = sender as CheckBox;var list = viewModel.MenuList.ToList();for (int i = 0; i < list.Count(); i++){var item = list[i];if (ck.Tag.ToString() == item.menu.HeaderCode){item.IsSelect = true;item.MenuChild = setBol(item.MenuChild, true, ck.Tag.ToString(), true);}else{item.MenuChild = setBol(item.MenuChild, true, ck.Tag.ToString());}} gg(ck.Tag.ToString(), list);}/// <summary>/// 修改是否选中/// </summary>/// <param name="list"></param>/// <param name="bol"></param>/// <returns></returns>public List<MenuParent> setBol(List<MenuParent> list, bool bol, string str, bool dbol = false){var d = list.ToList();for (int i = 0; i < d.Count(); i++){if (str == d[i].menu.HeaderCode || dbol){d[i].IsSelect = bol;if (d[i].MenuChild != null && d[i].MenuChild.Count > 0){d[i].MenuChild = setBol(d[i].MenuChild, bol, str, true);}}}return d;}/// <summary>/// 不选中/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void CkName_Unchecked(object sender, RoutedEventArgs e){CheckBox ck = sender as CheckBox;var list = viewModel.MenuList.ToList();for (int i = 0; i < list.Count(); i++){var item = list[i];if (ck.Tag.ToString() == item.menu.HeaderCode){item.IsSelect = false;item.MenuChild = setBol(item.MenuChild, false, ck.Tag.ToString(), true);}else{item.MenuChild = setBol(item.MenuChild, false, ck.Tag.ToString());}} gg(ck.Tag.ToString(),list);}/// <summary>///  /// </summary>/// <param name="cc"></param>/// <param name="list"></param> private void gg(string cc, List<MenuParent> list){List<MenuParent> xin = new List<MenuParent>();var r = viewModel.bphList(list.ToList()).Select(x => new MenuParent(x.IsSelect, x.menu)).OrderByDescending(x => x.menu.Remark).ToList();var one = r.FirstOrDefault(x=>x.menu.HeaderCode == cc);if (string.IsNullOrEmpty(one.menu.HeaderParent)){viewModel.MenuList = new System.Collections.ObjectModel.ObservableCollection<MenuParent>(viewModel.BuildTree(r.OrderBy(x => x.menu.Remark).ToList()));return;}xin123 = new List<MenuParent>();gg2(one.menu.Header,r);for (int i = 0; i < r.Count(); i++){var d = r[i];if (xin123.Any(x => x.menu.Header == d.menu.Header)){d.IsSelect = xin123.FirstOrDefault(x=>x.menu.Header==d.menu.Header).IsSelect;}}viewModel.MenuList = new System.Collections.ObjectModel.ObservableCollection<MenuParent>(viewModel.BuildTree(r.OrderBy(x=>x.menu.Remark).ToList()));}List<MenuParent> xin123 = new List<MenuParent>();private void gg2(string cc, List<MenuParent> list,string s=""){var r = list.ToList();var one = r.FirstOrDefault(x => x.menu.Header == cc);if(!string.IsNullOrEmpty(s) && one.menu.Header != s){if (r.Any(x => x.menu.HeaderParent == one.menu.Header && x.IsSelect)){one.IsSelect = true;}else{one.IsSelect = false;}xin123.Add(one);for (int i = 0; i < r.Count(); i++){var d = r[i];if (xin123.Any(x => x.menu.Header == d.menu.Header)){d.IsSelect = xin123.FirstOrDefault(x => x.menu.Header == d.menu.Header).IsSelect;}}}if (!string.IsNullOrEmpty(one.menu.HeaderParent)){gg2(one.menu.HeaderParent,list, cc);} }
public class t_menu
{/// <summary>/// /// </summary>public t_menu(){}private System.Int32 _id;/// <summary>/// /// </summary>public System.Int32 id { get { return this._id; } set { this._id = value; } }private System.String _HeaderCode;/// <summary>/// /// </summary>public System.String HeaderCode { get { return this._HeaderCode; } set { this._HeaderCode = value; } }private System.String _Header;/// <summary>/// /// </summary>public System.String Header { get { return this._Header; } set { this._Header = value; } }private System.String _HeaderParent;/// <summary>/// /// </summary>public System.String HeaderParent { get { return this._HeaderParent; } set { this._HeaderParent = value; } }private System.String _Remark;/// <summary>/// /// </summary>public System.String Remark { get { return this._Remark; } set { this._Remark = value; } }private System.SByte? _ToRole;/// <summary>/// /// </summary>public System.SByte? ToRole { get { return this._ToRole; } set { this._ToRole = value; } }private System.SByte? _status;/// <summary>/// /// </summary>public System.SByte? status { get { return this._status; } set { this._status = value; } }
}public class MenuParent{public t_menu menu { get; set; }/// <summary>/// 是否选中/// </summary>public bool IsSelect { get; set; }/// <summary>/// 子菜单列表/// </summary>public List<MenuParent> MenuChild { get; set; }public MenuParent(t_menu menu){this.menu = menu;this.IsSelect = false;this.MenuChild = new List<MenuParent>();}public MenuParent(bool IsSelect,t_menu menu){this.menu = menu;this.IsSelect = IsSelect;this.MenuChild = new List<MenuParent>();}}
// viewModel
// 初始化时 
List<MenuParent> menuParents = new List<MenuParent>();
MenuList = new ObservableCollection<MenuParent>();
MenuList = new ObservableCollection<MenuParent>(BuildTree(menuParents));private ObservableCollection<MenuParent> _menuList = new ObservableCollection<MenuParent>();/// <summary>/// 菜单列表/// </summary>public ObservableCollection<MenuParent> MenuList{get{return _menuList;}set{_menuList = value;OnPropertyChanged(() => MenuList);}}/// <summary>/// 转为tree结构/// </summary>/// <param name="flatList"></param>/// <returns></returns>public List<MenuParent> BuildTree(List<MenuParent> menuItems){// 创建一个字典来存储所有菜单项,以便快速查找  var menuDict = new Dictionary<string, MenuParent>();// 遍历菜单项,将它们添加到字典中  foreach (var item in menuItems){menuDict[item.menu.Header] = item;}// 创建一个列表来存储根菜单项(HeaderParent 为空或未设置的)  var rootMenuItems = new List<MenuParent>();// 再次遍历菜单项,构建树形结构  foreach (var item in menuItems){// 检查当前项是否有 HeaderParent  if (string.IsNullOrEmpty(item.menu.HeaderParent) || !menuDict.ContainsKey(item.menu.HeaderParent)){// 如果没有 HeaderParent 或找不到父节点,则它是根节点  rootMenuItems.Add(item);}else{// 找到父节点,并将当前项添加到其父节点的 Children 列表中  MenuParent parent = menuDict[item.menu.HeaderParent]; parent.MenuChild.Add(item);}}// 返回根菜单项列表  return rootMenuItems;}/// <summary>/// 获取list/// </summary>/// <returns></returns>public List<MenuParent> bphList(List<MenuParent> menuParents){List<MenuParent> menuParents1 = new List<MenuParent>();if(menuParents != null && menuParents.Count>0){foreach (var item in menuParents){var temp = item;if(temp != null && temp.MenuChild!=null && temp.MenuChild.Count>0){var d = bphList(temp.MenuChild);menuParents1.AddRange(d);} menuParents1.Add(item); }}return menuParents1;}

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

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

相关文章

开发一个自己的chrom插件

开发一个自己的chrom插件 一、创建一个文件夹 二、配置文件manifest.json 创建名字为&#xff1a;manifest.json的配置文件&#xff0c;模板如下&#xff1a; {"manifest_version": 3,"name": "Hello World Extension","version": …

AV1 编码标准屏幕内容编码技术概述

AV1 屏幕内容编码 为了提高屏幕捕获内容的压缩性能&#xff0c;AV1采用了几种编码工具&#xff0c;例如用于处理屏幕画面中重复模式的内帧内块复制&#xff08;IntraBC&#xff09;&#xff0c;以及用于处理颜色数量有限的屏幕块的调色板模式。 帧内块拷贝 AV1 编码中的 Intra …

【Elasticsearch7.11】reindex问题

参考博文链接 问题&#xff1a;reindex 时出现如下问题 原因&#xff1a;数据量大&#xff0c;kibana的问题 解决方法&#xff1a; 将DSL命令转化成CURL命令在服务上执行 CURL命令 自动转化 curl -XPOST "http://IP:PORT/_reindex" -H Content-Type: application…

Python: 一些python和Java不同的基础语法

文章目录 1. 数据类型2. 字符串的引用3. 字符串拼接4. Python中的报错5. Python中的输入语句(input)6. 运算符(**和//)7. 除法运算8. 注释方法: #或者三引号9. Python中的比较10. Java中用and, or, not代替逻辑运算符11. 多元赋值12. Python不支持自增自减操作13. 在Python中, …

zookeeper基础知识学习

官网&#xff1a;Apache ZooKeeper 下载地址&#xff1a;Index of /dist/zookeeper/zookeeper-3.5.7Index of /dist/zookeeperIndex of /dist/zookeeper/zookeeper-3.5.7 ZK配置参数说明&#xff1a; 1、tickTime2000&#xff1a;通讯心跳时间&#xff0c;zookeeper服务器与客…

笑中带泪《抓娃娃》

【标题】笑中带泪&#xff0c;《抓娃娃》&#xff1a;一场关于成长的中式惊悚喜剧盛宴在这个夏日炎炎的季节里&#xff0c;一部名为《抓娃娃》的电影悄然上映&#xff0c;以沈腾与马丽的黄金搭档再次点燃观众的热情。然而&#xff0c;当笑声在影院回荡时&#xff0c;一股不易察…

搭建图片缓存服务器,解决图片访问403 Forbidden问题

在现代Web开发中&#xff0c;图片是网站和应用的重要组成部分。然而&#xff0c;有时我们在访问某些图片时会遇到403 Forbidden错误&#xff0c;尤其是自己的应用访问互联网上的三方的图片时&#xff0c;这通常是由于别人的服务器设置了访问限制。本文将介绍如何通过搭建一个图…

7月15日学习打卡,二叉搜索树和字符串操作

hello大家好呀&#xff0c;本博客目的在于记录暑假学习打卡&#xff0c;后续会整理成一个专栏&#xff0c;主要打算在暑假学习完数据结构&#xff0c;因此会发一些相关的数据结构实现的博客和一些刷的题&#xff0c;个人学习使用&#xff0c;也希望大家多多支持&#xff0c;有不…

C#学习

C#学习 1.B站丑萌气质狗C#的循环-判断泛型错误处理面向对象static的使用定义showInfo类和Hero类 在这里插入图片描述 然后在该解决方案add新建一个类库&#xff0c;点击rebuild&#xff0c;会在bin文件夹下生成.dll文件 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direc…

数据类型与运算符

一、进制 1.1 进制的区分 1.2进制的换算 只要掌握计算器的方式即可。人工计算的方式了解一下就行了。 二、计算机数据的存储原理 2.1 存储单位 最小的单位&#xff1a;比特位 bit 1位比特要么为0&#xff0c;要么为1 最基本的单位&#xff1a;字节 …

Spring-Cache 缓存

1.简介 2.SpringCache 整合 简化缓存开发 1.导入依赖 <!-- spring cache --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId></dependency>2.redis 作为缓存…

二分法binary search

欢迎来到一夜看尽长安花 博客&#xff0c;您的点赞和收藏是我持续发文的动力 对于文章中出现的任何错误请大家批评指出&#xff0c;一定及时修改。有任何想要讨论的问题可联系我&#xff1a;3329759426qq.com 。发布文章的风格因专栏而异&#xff0c;均自成体系&#xff0c;不足…

解决一下git clone失败的问题

1&#xff09;.不开梯子&#xff0c;我们用https克隆 git clone https://github.com 报错&#xff1a; Failed to connect to github.com port 443 after 2091 ms: Couldnt connect to server 解决办法&#xff1a; 开梯子&#xff0c;然后# 注意修改成自己的IP和端口号 gi…

Java时间练习(7) (2024.7.17)

LocalDate、LocalTime、LocalDateTime类 package LocalExercise20240717; import java.time.LocalDate; import java.time.LocalTime; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter;public class LocalExercise {public static void main(Stri…

跟ChatGPT学习go语言-利用Go语言封装一个adb命令函数

问&#xff1a;在go语言中&#xff0c;根据不同的操作系统&#xff0c;选择adb文件路径来进行执行&#xff0c;封装成一个函数 package mainimport ("fmt""os/exec""runtime" )// GetADBPath 根据操作系统获取 ADB 可执行文件的路径 func GetAD…

docker搭建普罗米修斯监控gpu

ip8的服务器监控ip110和ip111的服务器 被监控的服务器110和111只需要安装node-export和nvidia-container-toolkit 下载镜像包 docker pull prom/node-exporter docker pull prom/prometheus docker pull grafana/grafana新建目录 mkdir /opt/prometheus cd /opt/prometheus/…

生信软件27 - 基于python的基因注释数据查询/检索库mygene

1. mygene库简介 MyGene.info提供简单易用的REST Web服务来查询/检索基因注释数据&#xff0c;具有以下特点&#xff1a; mygene技术文档&#xff1a; https://docs.mygene.info/en/latest/ 多物种支持: 包括人、小鼠、大鼠、斑马鱼等多个模式生物&#xff1b; 多数据源聚合…

卷积神经网络图像识别车辆类型

卷积神经网络图像识别车辆类型 1、图像 自行车: 汽车: 摩托车: 2、数据集目录 3、流程 1、获取数据,把图像转成矩阵,并随机划分训练集、测试集 2、把标签转为数值,将标签向量转换为二值矩阵 3、图像数据归一化,0-1之间的值 4、构造卷积神经网络 5、设置图像输入…

记录些MySQL题集(8)

ACID原则、事务隔离级别及事务机制原理 一、事务的ACID原则 什么是事务呢&#xff1f;事务通常是由一个或一组SQL组成的&#xff0c;组成一个事务的SQL一般都是一个业务操作&#xff0c;例如聊到的下单&#xff1a;「扣库存数量、增加订单详情记录、插入物流信息」&#xff0…

Qt5.12.2安装教程

文章目录 文章介绍下载连接安装教程 文章介绍 安装Qt5.12.2 下载连接 点击官网下载 安装包下载完毕 安装教程 点开设置&#xff0c;添加临时储存库&#xff0c;复制连接“https://download.qt.io/online/qtsdkrepository/windows_x86/root/qt/” 点击测试&#xff0…