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

news/2024/9/20 12:09:19

一、目的:在绑定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个人主页-哔哩哔哩视频


https://dhexx.cn/news/show-5395756.html

相关文章

特斯拉、路特斯、中国一汽、毕博、博世等企业将出席中国汽车供应链降碳和可持续国际峰会

由ECV International 举办的2024中国汽车供应链脱碳与可持续国际峰会将于2024年9月23-24日在上海召开。 在本次峰会上&#xff0c;来自全球各地的行业领袖、政策制定者、研究人员和利益相关者将齐聚一堂&#xff0c;商讨对于减少碳排放和促进整个汽车供应链可持续实践至关重要…

蓝卓为中小制造企业注入数字化转型活力

随着劳动力成本上升,原材料价格上涨,企业生产成本逐年增加&#xff0c;市场竞争越来越激烈&#xff0c;传统的中小制造企业面临着巨大的压力。 通过数字化转型应对环境的变化已成为行业共识&#xff0c;在数字化的进程中&#xff0c;中小企业首要考虑生存问题&#xff0c;不能…

btrace:binder_transaction+eBPF+Golang实现通用的Android APP动态行为追踪工具

一、简介&#xff1a; 在进行Android恶意APP检测时&#xff0c;需要进行自动化的行为分析&#xff0c;一般至少包括行为采集和行为分析两个模块。其中&#xff0c;行为分析有基于规则、基于机器学习、基于深度学习甚至基于大模型的方案&#xff0c;各有各的优缺点&#xff0c;不…

记一次java.lang.ClassCastException的java类型转换异常解决方案

一、问题描述 在系统中应用了spring的Cacheable注解功能&#xff0c;首次请求方法没问题&#xff0c;但在二次加载中&#xff0c;会抛出类转换异常&#xff0c;根本原因是&#xff1a;同一个类的加载类不同&#xff0c;既&#xff1a;applicationClassLoader 和 RestartClassL…

【ubuntu】用户添加root权限

添加root用户添加新用户并赋予权限 文件只读&#xff0c;无法更改 rootubuntu-server:/home/ubuntu# vi /etc/sudoers rootubuntu-server:/home/ubuntu# vi /etc/sudoers rootubuntu-server:/home/ubuntu# chmod -R 777 /etc/sudoers rootubuntu-server:/home/ubuntu# vi /et…

服务器部署开源大模型完整教程 Ollama+Gemma+open-webui

现在开源的大模型其实挺多的&#xff0c;今天搭建Gemma这个谷歌开源的大模型&#xff0c;但是你想搭建别的只要你看完你都会了。 介绍 Ollama&#xff1a;一款可以让你在本地快速搭建大模型的工具 官网&#xff1a;https://ollama.com/ github&#xff1a;https://github.c…

Netty中的Reactor模型实现

Netty版本&#xff1a;4.1.17 Reactor模型是Doug Lea在《Scalable IO in Java》提出的&#xff0c;主要是针对NIO的。 其中的主从Reactor模式在Netty中的配置如下&#xff1a; EventLoopGroup bossGroup new NioEventLoopGroup(1); EventLoopGroup workerGroup new NioEv…

音视频开发-- 坑整理

1. 解码时&#xff0c;一定要用avcodec_parameters_to_context()&#xff0c;将流的参数&#xff08;stream->codecpar&#xff09;复制到解码器中&#xff0c;否则某些流可能无法正常解码。 //第七步&#xff0c;给给解码器上下文添加参数, avcodec_parameters_to_context(…

ubuntu16因swap分区uuid错误启动慢排查

感觉ubuntu16启动特别慢 dmesg查看如下&#xff1a; [ 10.050123] audit: type1400 audit(1718608189.395:11): apparmor"STATUS" operation"profile_load" profile"unconfined" name"webbrowser-app//oxide_helper" pid708 comm&q…

大数据之flink与hive

其实吧我不太想写flink&#xff0c;因为线上经验确实不多&#xff0c;这也是我需要补的地方&#xff0c;没有条件创造条件&#xff0c;先来一篇吧 flink&#xff1a; 高性能 低延迟 流批一体的分布式计算框架 基于事件时间 对实时数据精准处理 快速响应 支持批处理&#xff0c…