Files
Shrlalgo.RvKits/Wpf.Ui.Extend/Controls/MultiTreeView/MultiTreeViewItem.cs
2024-09-22 11:05:41 +08:00

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;
}
}
}
}