码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 示例:WPF中TreeView自定义TreeNode泛型绑定对象来实现级联勾选


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


    二、实现


    三、环境


    VS2022

    四、示例

    定义如下节点类

    1. public partial class TreeNodeBase<T> : SelectBindable<T>, ITreeNode
    2. {
    3. public TreeNodeBase(T t) : base(t)
    4. {
    5. }
    6. private bool? _isChecked = false;
    7. public bool? IsChecked
    8. {
    9. get { return _isChecked; }
    10. set
    11. {
    12. _isChecked = value;
    13. RaisePropertyChanged();
    14. RefreshParentCheckState();
    15. RefreshChildrenCheckState();
    16. }
    17. }
    18. private void RefreshParentCheckState()
    19. {
    20. if (Parent == null)
    21. return;
    22. bool allChecked = Parent.Nodes.All(l => l.IsChecked == true);
    23. if (allChecked)
    24. {
    25. Parent.CheckOnlyCurrent(true);
    26. Parent.RefreshParentCheckState();
    27. return;
    28. }
    29. bool allUnChecked = Parent.Nodes.All(l => l.IsChecked == false);
    30. if (allUnChecked)
    31. {
    32. Parent.CheckOnlyCurrent(false);
    33. Parent.RefreshParentCheckState();
    34. return;
    35. }
    36. Parent.CheckOnlyCurrent(null);
    37. Parent.RefreshParentCheckState();
    38. }
    39. private void RefreshChildrenCheckState()
    40. {
    41. foreach (TreeNodeBase<T> item in Nodes)
    42. {
    43. item.CheckOnlyCurrent(IsChecked);
    44. item.RefreshChildrenCheckState();
    45. }
    46. }
    47. private void CheckOnlyCurrent(bool? value)
    48. {
    49. _isChecked = value;
    50. RaisePropertyChanged("IsChecked");
    51. }
    52. public TreeNodeBase<T> Parent { get; set; }
    53. private ObservableCollection<TreeNodeBase<T>> _nodes = new ObservableCollection>();
    54. public ObservableCollection<TreeNodeBase<T>> Nodes
    55. {
    56. get { return _nodes; }
    57. set
    58. {
    59. _nodes = value;
    60. RaisePropertyChanged();
    61. }
    62. }
    63. public void AddNode(TreeNodeBase<T> node)
    64. {
    65. node.Parent = this;
    66. Nodes.Add(node);
    67. }
    68. }

    其中核心方法是如下方法

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

    五、需要了解的知识点

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

  • 相关阅读:
    系统篇: ubuntu 下 sudo 命令执行慢的解决办法
    提取项目依赖包的licenses
    这三大特性,让 G1 取代了 CMS!
    计算机毕业设计Java木材产销系统的生产管理模块(源代码+数据库+系统+lw文档)
    spring boot 应用mybatis
    罗丹明标记的葡聚糖 70k,RB-Dextran,MW:70K
    层层剥开Android14升级后异常弹框的神秘面纱
    版本控制Git
    0031力扣191题---位1的个数
    辅助驾驶功能开发-功能对标篇(18)-NCA城市辅助系统-华为
  • 原文地址:https://blog.csdn.net/u010975589/article/details/139756103
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号