82 lines
2.6 KiB
C#
82 lines
2.6 KiB
C#
using System;
|
|
using System.Linq;
|
|
using System.Windows;
|
|
using System.Windows.Controls;
|
|
|
|
using Wpf.Ui.Extend.Extensions;
|
|
|
|
namespace Wpf.Ui.Extend.Controls;
|
|
public class MultiTreeViewItem : TreeViewItem
|
|
{
|
|
private MultiTreeView ParentMultiTreeView
|
|
{
|
|
//get { return ItemsControl.ItemsControlFromItemContainer(this) as MultiTreeView; }
|
|
get { return this.FindParent<MultiTreeView>(); }
|
|
}
|
|
static MultiTreeViewItem()
|
|
{
|
|
DefaultStyleKeyProperty.OverrideMetadata(typeof(MultiTreeViewItem), new FrameworkPropertyMetadata(typeof(MultiTreeViewItem)));
|
|
IsExpandedProperty.OverrideMetadata(typeof(MultiTreeViewItem), new FrameworkPropertyMetadata(true));
|
|
}
|
|
|
|
public bool? IsChecked
|
|
{
|
|
get { return (bool?)GetValue(IsCheckedProperty); }
|
|
set { SetValue(IsCheckedProperty, value); }
|
|
}
|
|
|
|
public static readonly DependencyProperty IsCheckedProperty =
|
|
DependencyProperty.Register(nameof(IsChecked), typeof(bool?), typeof(MultiTreeViewItem), new PropertyMetadata(false, new PropertyChangedCallback(OnIsCheckedChanged)));
|
|
|
|
/// <summary>
|
|
/// 获取项的容器。
|
|
/// </summary>
|
|
protected override DependencyObject GetContainerForItemOverride()
|
|
{
|
|
return new MultiTreeViewItem();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 确定项是否是其自己的容器。
|
|
/// </summary>
|
|
protected override bool IsItemItsOwnContainerOverride(object item)
|
|
{
|
|
return item is MultiTreeViewItem;
|
|
}
|
|
|
|
private static void OnIsCheckedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
|
|
{
|
|
var currentChildren = d.FindVisualChildren<MultiTreeViewItem>();
|
|
if (e.NewValue == e.OldValue)
|
|
{
|
|
return;
|
|
}
|
|
if (d is MultiTreeViewItem currentItem)
|
|
{
|
|
currentItem?.ParentMultiTreeView?.NotifyMultiTreeViewItemClicked(currentItem);
|
|
foreach (var item in currentItem.FindVisualChildren<MultiTreeViewItem>())
|
|
{
|
|
if (e.NewValue != null)
|
|
{
|
|
item.IsChecked = (bool)e.NewValue;
|
|
}
|
|
}
|
|
}
|
|
|
|
var parent = d.FindParent<MultiTreeViewItem>();
|
|
if (parent != null)
|
|
{
|
|
var children = parent.FindVisualChildren<MultiTreeViewItem>();
|
|
if (children.All(d => d.IsChecked == true))
|
|
{
|
|
parent.IsChecked = true;
|
|
}
|
|
else
|
|
{
|
|
parent.IsChecked = children.All(d => d.IsChecked == false) ? false : null;
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|