示例: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个人主页-哔哩哔哩视频

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

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

相关文章

java如何实现字符串替换

java要把指定的字符序列替换为新的字符序列&#xff0c;可以用replace语句 语法如下 str.replace(老字符序列,新字符序列) 这个语句最后是返回替换后的新字符串 示例代码如下 public class Stringreplace {public static void main(String[] args) {String str"登陆功…

clickhouse日常使用

ck高阶函数运用 数组函数 对数据中的特殊字符串进行替换&#xff0c;并根据分隔符进行切割&#xff0c;过滤掉为空的数组数据&#xff0c;对数据元素进行排序&#xff0c;在用分隔符拼接。 arrayStringConcat( arraySort( arrayDistinct( arrayFilter(o -> o ! , sp…

AI存储解决案例分享

AI数据管道&#xff08;Data Pipeline&#xff09;是指在AI项目中&#xff0c;数据从原始状态到最终可用模型的整个处理流程&#xff0c;包括数据采集、清洗、转换、分析、训练模型、验证模型直至部署和监控等多个环节。 在AI训练和推理过程中&#xff0c;多个管道可能同时读取…

使用 C# 进行面向对象编程:第 10 部分

封装和抽象之间的区别 对于 OOP 初学者来说&#xff0c;封装和抽象之间存在非常基本的区别。他们可能会对此感到困惑。但如果你详细了解这两个主题&#xff0c;就会发现它们之间存在巨大差异。 抽象意味着向用户隐藏不必要的数据。用户只需要所需的功能或根据其需求的输出。例…

Redis学习(11)|Redis键值管理与Spring Boot集成实战

文章目录 引言Redis键值管理概述Spring Boot中使用`RedisTemplate`进行键值管理结论键的生命周期管理,TTL(Time To Live)和过期策略,以及如何批量处理键。 引言 Redis是一款高性能的键值存储系统,以其速度、灵活性和丰富的数据结构而著称。键值管理是Redis的核心功能之一…

Flask-RQ

Flask-RQ库教程 Flask-RQ 是一个用于在 Flask 应用中集成 RQ&#xff08;Redis Queue&#xff09;的扩展。RQ 是一个简单的 Python 库&#xff0c;用于将任务排入 Redis 队列并异步执行这些任务。这对于处理长时间运行的任务&#xff08;如发送电子邮件、生成报告等&#xff0…

修改ppt注册表,导出高分辨率图片

参考&#xff1a;PPT中导出高分辨率图片的方法 修改ppt注册表&#xff0c;导出高分辨率图片&#xff1a;【具体步骤】 1、运行-输入regedit&#xff0c;打开注册表编辑器&#xff1b; 2、找到ppt中选项&#xff0c;按下面路径找。 3、鼠标右键新建-DWORD(32位)(D)&#xff0c…

Python对象复制竟然有这么多种方式,赶紧学起来!

目录 1、浅拷贝:copy模块的copy()函数 📋 1.1 浅拷贝原理揭秘 1.2 实战演示:列表与字典的浅拷贝 列表浅拷贝示例 字典浅拷贝示例 1.3 注意事项:共享引用与独立对象 2、深拷贝:copy模块的deepcopy()函数 📌 2.1 深拷贝实现机制解析 2.2 深拷贝优势分析 2.3 深度…

Hvv--知攻善防应急响应靶机--Linux2

HW–应急响应靶机–Linux2 所有靶机均来自 知攻善防实验室 靶机整理&#xff1a; 夸克网盘&#xff1a;https://pan.quark.cn/s/4b6dffd0c51a#/list/share百度云盘&#xff1a;https://pan.baidu.com/s/1NnrS5asrS1Pw6LUbexewuA?pwdtxmy 官方WP&#xff1a;https://mp.weixin.…

React@16.x(31)useLayoutEffect

目录 1&#xff0c;介绍2&#xff0c;注意点 1&#xff0c;介绍 在用法上和 useEffect 没有任何区别&#xff0c;只是执行的时间点不同。 useEffect 会在组件渲染结束后&#xff0c;UI展示在页面上之后再执行。所以不会阻塞渲染。useLayoutEffect 会在组件渲染结束后&#xf…

课设--学生成绩管理系统(核心代码部分)

欢迎来到 Papicatch的博客 系统介绍 课设--学生成绩管理系统&#xff08;一&#xff09;-CSDN博客 课设--学生成绩管理系统&#xff08;二&#xff09;-CSDN博客 课设--学生成绩管理系统&#xff08;三&#xff09;-CSDN博客 目录 &#x1f349;内部接口 &#x1f348; 登…

awtk界面实现下拉屏功能

单页面下拉屏 1.src/common/下创建slidescreen.h slidescreen.c slidescreen.h #ifndef SLIDESCREEN_H #define SLIDESCREEN_H#include "awtk.h" #include "../common/navigator.h"BEGIN_C_DECLS#define false 0 #define true 1//滑屏动作值 #define SL…

Navicat 安装及初步配置指南

Navicat 是一款广泛使用的数据库管理工具&#xff0c;支持多种数据库&#xff0c;如 MySQL、PostgreSQL、SQLite 等。以下是 Navicat 安装步骤的详细说明&#xff1a; 在 Windows 上安装 Navicat 下载 Navicat 安装包&#xff1a; 访问 Navicat 官方网站&#xff1a;Navicat 官…

第2讲:pixi.js 绘制HelloWorld

基于第0讲和第1讲&#xff0c;我们增添了vite.config.ts文件。并配置了其他的http端口。 此时&#xff0c;我们删除掉没用的东西。 删除 conter.ts、typescript.svg 在main.ts中改成如下内容&#xff1a; import {Application, Text} from pixi.js import ./style.css// 指明…

C语言笔记25 •顺序表介绍•

数据结构是计算机存储、组织数据的⽅式。数据结构是指相互之间存在⼀种或多种特定关系 的数据元素的集合。数据结构反映数据的内部构成&#xff0c;即数据由那部分构成&#xff0c;以什么⽅式构成&#xff0c;以及数据元素之间呈现的结构。也就是能够存储数据&#xff1b; 存储…

中介子方程二十二

X$XFX$XdXuXWXπX$XWXeXyXeXyXeXWX$XπXWXuXdX$XFX$XEXyXαXiX$XαXiXrXkXtXyX$XpXVX$XdXuXWXπX$XWXeXyXeXyXeXWX$XπXWXuXdX$XVXpX$XyXtXkXrXiXαX$XiXαXyXEX$XFX$XEXyXαXiX$XαXiXrXkXtXyX$XpXVX$XdXuXWXπX$XWXeXyXeXyXeXWX$XπXWXuXdX$XVXpX$XyXtXkXrXiXαX$XiXαXyXEX$…

导航台运营状态明细

Select a.部门, a.最近登陆时间, b.prev_exec_start 访问时间, b.username 访问用户, b.姓名 From zlClients A, (Select a.Prev_Exec_Start, a.Username, Terminal, c.姓名 From sys.gv_$session A, 上机人员表 B, 人员…

Nginx06-rewrite模块详解与实验

目录 写在前面Nginx06nginx rewriterewrite 模块return案例01 访问/admin/ 返回403案例02 域名间跳转 if案例03 只允许GET、POST请求&#xff0c;其他禁止访问 set案例04 设置是否处于维护状态&#xff0c;是则返回503&#xff0c;否则正常访问 rewrite案例05 域名跳转案例06 r…

Unity | Shader基础知识(第十四集:简单效果练习)

目录 前言 一、效果预览 1.弧形边缘光 二、效果制作 1. 制作弧形边缘光 2.弧形边缘光进阶 3.弧形边缘光调节渐变范围 4.边缘光突变 5.同心圆 三、加入世界坐标做效果 1.绘制结界 2.斑马球 3.效果合并 四、作者的碎碎念 前言 有粉丝建议说&#xff0c;让我继续更新…

JMU 数科 数据库与数据仓库期末总结(4)实验设计题

E-R图 实体-关系图 E-R图的组成要素主要包括&#xff1a; 实体&#xff08;Entity&#xff09;&#xff1a;实体代表现实世界中可相互区别的对象或事物&#xff0c;如顾客、订单、产品等。在图中&#xff0c;实体通常用矩形表示&#xff0c;并在矩形内标注实体的名称。 属性…