添加项目文件。
This commit is contained in:
81
Wpf.Ui.Extend/Controls/MultiTreeView/MultiTreeViewItem.cs
Normal file
81
Wpf.Ui.Extend/Controls/MultiTreeView/MultiTreeViewItem.cs
Normal file
@@ -0,0 +1,81 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user