• treeview形式的checkbox(wpf、c#)


    如何实现treeview形式的checkbox,并且父节点和子节点的选中状态可相互影响。示例图:
    在这里插入图片描述

    代码如下:

    wpf代码:treeview绑定的数据是PermissionDataCollection。

    <TreeView ItemsSource="{Binding PermissionDataCollection}">
    	<TreeView.ItemTemplate>
    		<HierarchicalDataTemplate ItemsSource="{Binding Children}">
    			<StackPanel Orientation="Horizontal" >
    				<CheckBox IsChecked="{Binding IsChecked}"/>
    				<TextBlock Text="{Binding Name}"/>
    			 </StackPanel>
    		</HierarchicalDataTemplate>
    	</TreeView.ItemTemplate>
    </TreeView>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    后端数据来源:PermissionDataCollection的声明及定义:

    public ObservableCollection<TreeViewItemModel> PermissionDataCollection { get; set; }
    
    • 1
    PermissionDataCollection = new ObservableCollection<TreeViewItemModel>();
    
    // 添加根节点
    var rootNode = new TreeViewItemModel { Name = "所有权限", IsChecked = false, Children = new ObservableCollection<TreeViewItemModel>() };
    PermissionDataCollection0.Add(rootNode);
    
    // 添加子节点
    var childNode1 = new TreeViewItemModel { Name = "系统设置", IsChecked = false, Children = new ObservableCollection<TreeViewItemModel>(), Parent = rootNode };
    var childNode2 = new TreeViewItemModel { Name = "日志管理", IsChecked = true, Children = new ObservableCollection<TreeViewItemModel>(), Parent = rootNode };
    rootNode.Children.Add(childNode1);
    rootNode.Children.Add(childNode2);
    
    // 添加孙子节点
    var grandChildNode1 = new TreeViewItemModel { Name = "相机设置", IsChecked = true, Children = new ObservableCollection<TreeViewItemModel>(), Parent = childNode1 };
    var grandChildNode2 = new TreeViewItemModel { Name = "参数设置", IsChecked = false, Children = new ObservableCollection<TreeViewItemModel>(), Parent = childNode1};
    childNode1.Children.Add(grandChildNode1);
    childNode1.Children.Add(grandChildNode2);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    TreeViewItemModel的定义:(也就是定义treeview形式的checkbox)

    public class TreeViewItemModel : INotifyPropertyChanged
    {
      private bool _isChecked;
      private bool _isUpdatingChildren;
    
      public string Name { get; set; }
    
      public bool IsChecked
      {
          get { return _isChecked; }
          set
          {
              if (_isChecked != value)
              {
                  _isChecked = value;
                  OnPropertyChanged(nameof(IsChecked));
    
                  if (!_isUpdatingChildren && Children != null)
                  {
                      _isUpdatingChildren = true;
    
                      // 递归设置子节点的勾选状态
                      foreach (var child in Children)
                      {
                          child.IsChecked = value;
                      }
    
                      _isUpdatingChildren = false;
                  }
    
                  // 更新父节点的勾选状态
                  if (Parent != null)
                  {
                      UpdateParentCheckedState();
                  }
              }
          }
      }
    
      public ObservableCollection<TreeViewItemModel> Children { get; set; }
    
      public TreeViewItemModel Parent { get; set; }
    
      public event PropertyChangedEventHandler PropertyChanged;
    
      protected virtual void OnPropertyChanged(string propertyName)
      {
          PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
      }
    
      public void UpdateParentCheckedState()
      {
          if (Parent != null)
          {
              bool allSiblingsChecked = Parent.Children.All(child => child.IsChecked);
              bool anySiblingChecked = Parent.Children.Any(child => child.IsChecked);
    
              if (allSiblingsChecked)
              {
                  Parent._isChecked = true;
              }
              else if (anySiblingChecked)
              {
                  Parent._isChecked = false;
              }
              else
              {
                  Parent._isChecked = false;
              }
    
              Parent.OnPropertyChanged(nameof(IsChecked));
              Parent.UpdateParentCheckedState();
          }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
  • 相关阅读:
    最详细的专利申请教程,教你如何申请专利
    重新认识 MSBuild - 1
    Java 注解及其底层原理
    软件开发和测试
    LeetCode两个链表的第一个重合节点
    熟悉Redis命令行
    1699. 两人之间的通话次数
    Hadoop(HDFS)
    大数据之LibrA数据库系统告警处理(ALM-12032 ommdba用户或密码即将过期)
    自己用操作系统四元素:进程线程管理、内存管理、文件系统和驱动一起拼一个RTOS
  • 原文地址:https://blog.csdn.net/modifier_/article/details/132826469