当前位置: 首页 > news >正文

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;}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 降低芯片流片风险的几种方法
  • 算法第十天:leetcode203.移除链表元素
  • 【C++】C++11的新特性 --- 右值引用与移动语义
  • 排序系列 之 选择排序
  • FastAPI -- 第三弹(自定义响应、中间件、代理、WebSockets)
  • 【Python 对接QQ的接口(三)】简单用接口查询【等级/昵称/头像/Q龄/状态/会员/当天在线时长/下一个等级升级需多少天】
  • 架构以及架构中的组件
  • 迪米特法则
  • leetcode145. 二叉树的后序遍历,递归法+迭代法,全过程图解+步步解析,一点点教会你迭代法后序遍历
  • Web3时代的教育技术革新:智能合约在学习管理中的应用
  • 收银系统源码-线上商城diy装修
  • 腾讯元宝上线“3D角色梦工厂”:快速生成专属3D角色!
  • 求职学习day5
  • 01 MySQL
  • JavaWeb笔记_Response对象
  • “大数据应用场景”之隔壁老王(连载四)
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • avalon2.2的VM生成过程
  • Fastjson的基本使用方法大全
  • Leetcode 27 Remove Element
  • nodejs实现webservice问题总结
  • 聚类分析——Kmeans
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 浅谈web中前端模板引擎的使用
  • 区块链分支循环
  • 三栏布局总结
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • # .NET Framework中使用命名管道进行进程间通信
  • #ifdef 的技巧用法
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (数据大屏)(Hadoop)基于SSM框架的学院校友管理系统的设计与实现+文档
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • *算法训练(leetcode)第四十五天 | 101. 孤岛的总面积、102. 沉没孤岛、103. 水流问题、104. 建造最大岛屿
  • .NET CF命令行调试器MDbg入门(一)
  • .net core控制台应用程序初识
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • .NET大文件上传知识整理
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?
  • /etc/fstab 只读无法修改的解决办法
  • :not(:first-child)和:not(:last-child)的用法
  • @Autowired 与@Resource的区别
  • @font-face 用字体画图标
  • @transaction 提交事务_【读源码】剖析TCCTransaction事务提交实现细节
  • [ IOS ] iOS-控制器View的创建和生命周期
  • []串口通信 零星笔记
  • [1]从概念到实践:电商智能助手在AI Agent技术驱动下的落地实战案例深度剖析(AI Agent技术打造个性化、智能化的用户助手)