How to develop treeview with checkboxes in wpf?

后端 未结 5 1089
小蘑菇
小蘑菇 2020-12-16 21:41

I have a requirement that , I need to add nodes to a TreeView dynamically and that nodes with CheckBoxes. If one CheckBox is selected

5条回答
  •  长情又很酷
    2020-12-16 22:26

    I added onto @pr0gg3r's answer to make it generic. I'm not sure if this is necessarily the best way, but it's a little more flexible.

    MainWindow is the same, but the other classes differ slightly.

    IParent.cs

    interface IParent
    {
        IEnumerable GetChildren();
    }
    

    DataModel.cs

    using System;
    using System.Collections.Generic;
    using System.Windows;
    
    public class Family : DependencyObject, IParent
    {
        public string Name { get; set; }
        public List Members { get; set; }
    
        IEnumerable IParent.GetChildren()
        {
            return Members;
        }
    }
    
    public class Person : DependencyObject
    {
        public string Name { get; set; }
    }
    
    
    

    ItemHelper.cs

    using System.Linq;
    using System.Windows;
    
    public class ItemHelper : DependencyObject
    {
        public static readonly DependencyProperty IsCheckedProperty =
            DependencyProperty.RegisterAttached("IsChecked", typeof(bool?), typeof(ItemHelper),
                new PropertyMetadata(false, new PropertyChangedCallback(OnIsCheckedPropertyChanged)));
    
        private static void OnIsCheckedPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            IParent sect = d as IParent;
            DependencyObject depObj = d as DependencyObject;
    
            if (sect != null)
            {
                if (((bool?)e.NewValue).HasValue)
                {
                    foreach (DependencyObject p in sect.GetChildren())
                    {
                        SetIsChecked(p, (bool?)e.NewValue);
                    }
                }
            }
    
            if (depObj != null)
            {
                var parentObject = depObj.GetValue(ParentProperty) as IParent;
                var parentDO = depObj.GetValue(ParentProperty) as DependencyObject;
                int ch = parentObject?.GetChildren()?.Where(
                    x => GetIsChecked(x as DependencyObject) == true).Count() ?? 0;
                int un = parentObject?.GetChildren()?.Where(
                    x => GetIsChecked(x as DependencyObject) == false).Count() ?? 0;
                if (un > 0 && ch > 0)
                {
                    SetIsChecked(parentDO, null);
                    return;
                }
                if (ch > 0)
                {
                    SetIsChecked(parentDO, true);
                    return;
                }
                SetIsChecked(parentDO, false);
            }
        }
        public static void SetIsChecked(DependencyObject element, bool? IsChecked)
        {
            element?.SetValue(IsCheckedProperty, IsChecked);
        }
        public static bool? GetIsChecked(DependencyObject element)
        {
            return (bool?)element?.GetValue(IsCheckedProperty);
        }
    
        public static readonly DependencyProperty ParentProperty =
            DependencyProperty.RegisterAttached("Parent", typeof(object), typeof(ItemHelper));
    
        public static void SetParent(DependencyObject element, object Parent)
        {
            element?.SetValue(ParentProperty, Parent);
        }
        public static object GetParent(DependencyObject element)
        {
            return element?.GetValue(ParentProperty);
        }
    }
    
        

    提交回复
    热议问题