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

相关推荐

最近更新

  1. 使用ADB命令控制logcat日志本地存储功能

    2024-06-18 04:54:01       0 阅读
  2. matlab实现pid控制空调温度

    2024-06-18 04:54:01       0 阅读
  3. 深入浅出Transformer:大语言模型的核心技术

    2024-06-18 04:54:01       0 阅读
  4. NLP - Softmax与层次Softmax对比

    2024-06-18 04:54:01       1 阅读
  5. Rust 启航:为何选择 Rust 及其核心价值

    2024-06-18 04:54:01       1 阅读
  6. 安装Go语言常用工具

    2024-06-18 04:54:01       1 阅读

热门阅读

  1. 浔川画板v5.0——浔川python科技社

    2024-06-18 04:54:01       9 阅读
  2. C# —— for循环语句

    2024-06-18 04:54:01       7 阅读
  3. 鸿蒙开发:【启动本地PageAbility】

    2024-06-18 04:54:01       7 阅读
  4. 地学类期刊最新CiteScore™ 汇总

    2024-06-18 04:54:01       8 阅读
  5. 怎么通过AI构架一个个人简介并且写出来

    2024-06-18 04:54:01       9 阅读
  6. C++240617

    C++240617

    2024-06-18 04:54:01      8 阅读
  7. 数据库修复实例2(副本出入口修复)

    2024-06-18 04:54:01       8 阅读
  8. Leetcode 415. 字符串相加-大数相加

    2024-06-18 04:54:01       9 阅读
  9. Docker使用心得

    2024-06-18 04:54:01       11 阅读
  10. 富格林:细心发现虚假确保安全

    2024-06-18 04:54:01       8 阅读