102 lines
3.3 KiB
C#
102 lines
3.3 KiB
C#
using System;
|
|
using System.Diagnostics;
|
|
using System.Reflection;
|
|
using System.Windows;
|
|
using System.Windows.Controls;
|
|
|
|
using WPFluent.Controls.Primitives;
|
|
|
|
namespace WPFluent.Controls;
|
|
|
|
public class TreeListView : TreeView
|
|
{
|
|
public new object SelectedItem
|
|
{
|
|
get => GetValue(SelectedItemProperty);
|
|
set => SetValue(SelectedItemProperty, value);
|
|
}
|
|
|
|
public new static readonly DependencyProperty SelectedItemProperty =
|
|
DependencyProperty.Register(nameof(SelectedItem), typeof(object), typeof(TreeListView), new PropertyMetadata(null, OnNewSelectedItemChanged));
|
|
|
|
private static void OnNewSelectedItemChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
|
|
{
|
|
// Use the private `TreeView::SelectedItemProperty` to
|
|
// allow writing to the readonly `TreeView::SelectedItemProperty`.
|
|
if (d is TreeListView treeListView)
|
|
{
|
|
object? newValue = e.NewValue;
|
|
|
|
if (typeof(TreeView).GetField("SelectedItemPropertyKey", BindingFlags.NonPublic | BindingFlags.Static) is FieldInfo fieldInfo)
|
|
{
|
|
DependencyPropertyKey selectedItemPropertyKey = (DependencyPropertyKey)fieldInfo.GetValue(null)!;
|
|
object? currentValue = treeListView.GetValue(TreeView.SelectedItemProperty);
|
|
|
|
if (currentValue != newValue)
|
|
{
|
|
treeListView.SetValue(selectedItemPropertyKey, newValue);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public TreeListView()
|
|
{
|
|
SelectedItemChanged += (sender, e) =>
|
|
{
|
|
// Avoid exceptions caused by possible inconsistencies with
|
|
// the handling of readonly `TreeView::SelectedItemProperty`.
|
|
try
|
|
{
|
|
if (SelectedItem != base.SelectedItem)
|
|
{
|
|
SelectedItem = base.SelectedItem;
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Debug.WriteLine(ex);
|
|
}
|
|
};
|
|
|
|
MouseRightButtonDown += (_, e) =>
|
|
{
|
|
if (e.OriginalSource is DependencyObject source)
|
|
{
|
|
if (source.FindAscendant<TreeViewItem>() is TreeViewItem { } treeViewItem)
|
|
{
|
|
treeViewItem.IsSelected = true;
|
|
}
|
|
}
|
|
};
|
|
}
|
|
|
|
public GridViewColumnCollection Columns
|
|
{
|
|
get => (GridViewColumnCollection)GetValue(ColumnsProperty);
|
|
set => SetValue(ColumnsProperty, value);
|
|
}
|
|
|
|
public static readonly DependencyProperty ColumnsProperty =
|
|
DependencyProperty.Register(nameof(Columns), typeof(GridViewColumnCollection), typeof(TreeListView), new PropertyMetadata(null));
|
|
|
|
public CornerRadius CornerRadius
|
|
{
|
|
get => (CornerRadius)GetValue(CornerRadiusProperty);
|
|
set => SetValue(CornerRadiusProperty, value);
|
|
}
|
|
|
|
public static readonly DependencyProperty CornerRadiusProperty =
|
|
DependencyProperty.Register(nameof(CornerRadius), typeof(CornerRadius), typeof(TreeListView), new PropertyMetadata(new CornerRadius(4d)));
|
|
|
|
protected override DependencyObject GetContainerForItemOverride()
|
|
{
|
|
return new TreeListViewItem();
|
|
}
|
|
|
|
protected override bool IsItemItsOwnContainerOverride(object item)
|
|
{
|
|
return item is TreeListViewItem;
|
|
}
|
|
}
|