From 002dffe88e3bfa20ef752c185389eca85c797eb9 Mon Sep 17 00:00:00 2001 From: CHINBOY Date: Fri, 27 Jun 2025 12:11:32 +0800 Subject: [PATCH] Fix TreeViewItem --- src/AtomUI.Controls/TreeView/TreeViewItem.cs | 45 ++++++++++++++++++-- 1 file changed, 42 insertions(+), 3 deletions(-) diff --git a/src/AtomUI.Controls/TreeView/TreeViewItem.cs b/src/AtomUI.Controls/TreeView/TreeViewItem.cs index fd45f9183..dfc8a0ebc 100644 --- a/src/AtomUI.Controls/TreeView/TreeViewItem.cs +++ b/src/AtomUI.Controls/TreeView/TreeViewItem.cs @@ -28,7 +28,8 @@ using AvaloniaTreeItem = Avalonia.Controls.TreeViewItem; [PseudoClasses(TreeViewPseudoClass.NodeToggleTypeCheckBox, TreeViewPseudoClass.NodeToggleTypeRadio, TreeViewPseudoClass.TreeNodeHover)] public class TreeViewItem : AvaloniaTreeItem, - IResourceBindingManager + IResourceBindingManager, + IRadioButton { #region 公共属性定义 public static readonly StyledProperty IconProperty @@ -316,7 +317,7 @@ public class TreeViewItem : AvaloniaTreeItem, set => SetAndRaise(IsSwitcherRotationProperty, ref _isSwitcherRotation, value); } - internal ItemToggleType ToggleType + public ItemToggleType ToggleType { get => GetValue(ToggleTypeProperty); set => SetValue(ToggleTypeProperty, value); @@ -326,7 +327,8 @@ public class TreeViewItem : AvaloniaTreeItem, CompositeDisposable? IResourceBindingManager.ResourceBindingsDisposable => _resourceBindingsDisposable; private bool _tempAnimationDisabled = false; - + private ITreeViewInteractionHandler? TreeViewInteractionHandler => this.FindLogicalAncestorOfType()?.InteractionHandler; + #endregion private CompositeDisposable? _resourceBindingsDisposable; @@ -409,6 +411,18 @@ public class TreeViewItem : AvaloniaTreeItem, { SetupSwitcherButtonIconMode(); } + else if (change.Property == GroupNameProperty) + { + HandleGroupNameChanged(change); + } + else if (change.Property == IsCheckedProperty) + { + HandleIsCheckedChanged(change); + } + else if (change.Property == ToggleTypeProperty) + { + HandleToggleTypeChanged(change); + } if (this.IsAttachedToVisualTree()) { @@ -485,6 +499,31 @@ public class TreeViewItem : AvaloniaTreeItem, } } + private void HandleGroupNameChanged(AvaloniaPropertyChangedEventArgs e) + { + (TreeViewInteractionHandler as DefaultTreeViewInteractionHandler)?.OnGroupOrTypeChanged(this, e.GetOldValue()); + } + + private void HandleToggleTypeChanged(AvaloniaPropertyChangedEventArgs e) + { + var newValue = e.GetNewValue(); + PseudoClasses.Set(TreeViewPseudoClass.NodeToggleTypeRadio, newValue == ItemToggleType.Radio); + PseudoClasses.Set(TreeViewPseudoClass.NodeToggleTypeCheckBox, newValue == ItemToggleType.CheckBox); + + (TreeViewInteractionHandler as DefaultTreeViewInteractionHandler)?.OnGroupOrTypeChanged(this, GroupName); + } + + private void HandleIsCheckedChanged(AvaloniaPropertyChangedEventArgs e) + { + var newValue = e.GetNewValue(); + PseudoClasses.Set(StdPseudoClass.Checked, newValue == true); + + if (newValue == true) + { + (TreeViewInteractionHandler as DefaultTreeViewInteractionHandler)?.OnCheckedChanged(this); + } + } + private void ExpandChildren() { if (_itemsPresenterMotionActor is null ||