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

示例:WPF中TreeView自定义TreeNode泛型绑定对象来实现级联勾选

一、目的:在绑定TreeView的功能中经常会遇到需要在树节点前增加勾选CheckBox框,勾选本节点的同时也要同步显示父节点和子节点状态


二、实现


三、环境


VS2022

四、示例

定义如下节点类

   public partial class TreeNodeBase<T> : SelectBindable<T>, ITreeNode{public TreeNodeBase(T t) : base(t){}private bool? _isChecked = false;public bool? IsChecked{get { return _isChecked; }set{_isChecked = value;RaisePropertyChanged();RefreshParentCheckState();RefreshChildrenCheckState();}}private void RefreshParentCheckState(){if (Parent == null)return;bool allChecked = Parent.Nodes.All(l => l.IsChecked == true);if (allChecked){Parent.CheckOnlyCurrent(true);Parent.RefreshParentCheckState();return;}bool allUnChecked = Parent.Nodes.All(l => l.IsChecked == false);if (allUnChecked){Parent.CheckOnlyCurrent(false);Parent.RefreshParentCheckState();return;}Parent.CheckOnlyCurrent(null);Parent.RefreshParentCheckState();}private void RefreshChildrenCheckState(){foreach (TreeNodeBase<T> item in Nodes){item.CheckOnlyCurrent(IsChecked);item.RefreshChildrenCheckState();}}private void CheckOnlyCurrent(bool? value){_isChecked = value;RaisePropertyChanged("IsChecked");}public TreeNodeBase<T> Parent { get; set; }private ObservableCollection<TreeNodeBase<T>> _nodes = new ObservableCollection<TreeNodeBase<T>>();public ObservableCollection<TreeNodeBase<T>> Nodes{get { return _nodes; }set{_nodes = value;RaisePropertyChanged();}}public void AddNode(TreeNodeBase<T> node){node.Parent = this;Nodes.Add(node);}}

其中核心方法是如下方法

分别在当前节点勾选有变化时去更新父节点和子节点的勾选状态 

五、需要了解的知识点

TreeView 类 (System.Windows.Controls) | Microsoft Learn

六、源码地址

GitHub - HeBianGu/WPF-ControlDemo: 示例

GitHub - HeBianGu/WPF-ControlBase: Wpf封装的自定义控件资源库

GitHub - HeBianGu/WPF-Control: WPF轻量控件和皮肤库

七、了解更多

System.Windows.Controls 命名空间 | Microsoft Learn

https://github.com/HeBianGu

HeBianGu的个人空间-HeBianGu个人主页-哔哩哔哩视频

相关文章:

  • 【PB案例学习笔记】-22制作一个语音朗读金额小应用
  • 持续学习的综述: 理论、方法与应用
  • ssldump一键分析网络流量(KALI工具系列二十二)
  • webClient + fastJSON2 获取json格式的数据,同时解析至java class 并 下划线转驼峰
  • 34.extern C的作用
  • 【读博日记】拓扑结构(待修正)
  • Standalone原理讲解与实操演示
  • 考研计算机网络(第一章 概述)
  • 使用 Redis 生成分布式唯一ID
  • python调用SDK的问题
  • 六、Nginx-正向代理和反向代理
  • 吴恩达2022机器学习专项课程C2W3:2.26 机器学习发展历程
  • 最佳websocket封装
  • java8 List的Stream流操作 (实用篇 三)
  • 【Effective Web】常见的css布局方式--三栏布局
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • avalon2.2的VM生成过程
  • javascript面向对象之创建对象
  • python3 使用 asyncio 代替线程
  • Rancher如何对接Ceph-RBD块存储
  • Vue.js 移动端适配之 vw 解决方案
  • webgl (原生)基础入门指南【一】
  • 深度学习入门:10门免费线上课程推荐
  • 正则表达式
  • Hibernate主键生成策略及选择
  • 阿里云ACE认证之理解CDN技术
  • ​水经微图Web1.5.0版即将上线
  • #ifdef 的技巧用法
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • (2)nginx 安装、启停
  • (C#)一个最简单的链表类
  • (poj1.3.2)1791(构造法模拟)
  • (windows2012共享文件夹和防火墙设置
  • (Windows环境)FFMPEG编译,包含编译x264以及x265
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (第30天)二叉树阶段总结
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (多级缓存)缓存同步
  • (二开)Flink 修改源码拓展 SQL 语法
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .NET 4.0中的泛型协变和反变
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .NET CORE 第一节 创建基本的 asp.net core
  • .net core使用RPC方式进行高效的HTTP服务访问
  • @31省区市高考时间表来了,祝考试成功
  • [ Linux ] git工具的基本使用(仓库的构建,提交)
  • [ Linux 长征路第五篇 ] make/Makefile Linux项目自动化创建工具
  • []使用 Tortoise SVN 创建 Externals 外部引用目录
  • [2016.7.test1] T2 偷天换日 [codevs 1163 访问艺术馆(类似)]
  • [20190416]完善shared latch测试脚本2.txt
  • [C/C++]数据结构 堆的详解
  • [c]扫雷
  • [Intel Edison开发板] 05、Edison开发基于MRAA实现IO控制,特别是UART通信