84 lines
2.5 KiB
C#
84 lines
2.5 KiB
C#
|
|
using WPFluent.Extensions;
|
|
|
|
using System;
|
|
|
|
using System.Linq;
|
|
|
|
|
|
namespace WPFluent.Controls;
|
|
|
|
public class MultiTreeViewItem : System.Windows.Controls.TreeViewItem
|
|
{
|
|
public static readonly DependencyProperty IsCheckedProperty =
|
|
DependencyProperty.Register(
|
|
nameof(IsChecked),
|
|
typeof(bool?),
|
|
typeof(MultiTreeViewItem),
|
|
new PropertyMetadata(false, new PropertyChangedCallback(OnIsCheckedChanged)));
|
|
|
|
static MultiTreeViewItem()
|
|
{
|
|
DefaultStyleKeyProperty.OverrideMetadata(
|
|
typeof(MultiTreeViewItem),
|
|
new FrameworkPropertyMetadata(typeof(MultiTreeViewItem)));
|
|
IsExpandedProperty.OverrideMetadata(typeof(MultiTreeViewItem), new FrameworkPropertyMetadata(true));
|
|
}
|
|
|
|
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;
|
|
}
|
|
}
|
|
}
|
|
|
|
private MultiTreeView ParentMultiTreeView
|
|
{
|
|
//get { return ItemsControl.ItemsControlFromItemContainer(this) as MultiTreeView; }
|
|
get { return this.FindParent<MultiTreeView>(); }
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取项的容器。
|
|
/// </summary>
|
|
protected override DependencyObject GetContainerForItemOverride() { return new MultiTreeViewItem(); }
|
|
|
|
/// <summary>
|
|
/// 确定项是否是其自己的容器。
|
|
/// </summary>
|
|
protected override bool IsItemItsOwnContainerOverride(object item) { return item is MultiTreeViewItem; }
|
|
|
|
public bool? IsChecked
|
|
{
|
|
get { return (bool?)GetValue(IsCheckedProperty); }
|
|
set { SetValue(IsCheckedProperty, value); }
|
|
}
|
|
}
|