From 1dc8f04eaf7c8a2b376bbca5d8b0265866596b5a Mon Sep 17 00:00:00 2001 From: chinboy Date: Tue, 3 Mar 2026 09:04:19 +0800 Subject: [PATCH] Refactor(Cascader): Refactor CheckedOptions -> SelectedOptions --- .../Cascader/Cascader.cs | 162 +++++++++++------- .../Cascader/CascaderView.Check.cs | 98 +++++------ .../Cascader/CascaderView.cs | 16 +- ...ascaderOptionsSelectedChangedEventArgs.cs} | 4 +- .../Cascader/Themes/CascaderTheme.axaml | 2 +- .../Select/AbstractSelect.cs | 12 ++ 6 files changed, 171 insertions(+), 123 deletions(-) rename src/AtomUI.Desktop.Controls/Cascader/EventArgs/{CascaderViewCheckedOptionsChangedEventArgs.cs => CascaderOptionsSelectedChangedEventArgs.cs} (54%) diff --git a/src/AtomUI.Desktop.Controls/Cascader/Cascader.cs b/src/AtomUI.Desktop.Controls/Cascader/Cascader.cs index 96f87be2b..cd060dda1 100644 --- a/src/AtomUI.Desktop.Controls/Cascader/Cascader.cs +++ b/src/AtomUI.Desktop.Controls/Cascader/Cascader.cs @@ -45,11 +45,11 @@ public class Cascader : AbstractSelect, IControlSharedTokenResourcesHost o => o.SelectedOption, (o, v) => o.SelectedOption = v); - public static readonly DirectProperty?> CheckedOptionsProperty = - AvaloniaProperty.RegisterDirect?>( - nameof(CheckedOptions), - o => o.CheckedOptions, - (o, v) => o.CheckedOptions = v); + public static readonly DirectProperty?> SelectedOptionsProperty = + AvaloniaProperty.RegisterDirect?>( + nameof(SelectedOptions), + o => o.SelectedOptions, + (o, v) => o.SelectedOptions = v); public static readonly StyledProperty ExpandIconProperty = CascaderView.ExpandIconProperty.AddOwner(); @@ -113,10 +113,10 @@ public class Cascader : AbstractSelect, IControlSharedTokenResourcesHost private IList? _checkedOptions; - public IList? CheckedOptions + public IList? SelectedOptions { get => _checkedOptions; - set => SetAndRaise(CheckedOptionsProperty, ref _checkedOptions, value); + set => SetAndRaise(SelectedOptionsProperty, ref _checkedOptions, value); } public IconTemplate? ExpandIcon @@ -187,11 +187,11 @@ public class Cascader : AbstractSelect, IControlSharedTokenResourcesHost o => o.IsMaxSelectReached, (o, v) => o.IsMaxSelectReached = v); - internal static readonly DirectProperty?> EffectiveCheckedOptionsProperty = + internal static readonly DirectProperty?> EffectiveSelectedOptionsProperty = AvaloniaProperty.RegisterDirect?>( - nameof(EffectiveCheckedOptions), - o => o.EffectiveCheckedOptions, - (o, v) => o.EffectiveCheckedOptions = v); + nameof(EffectiveSelectedOptions), + o => o.EffectiveSelectedOptions, + (o, v) => o.EffectiveSelectedOptions = v); internal static readonly DirectProperty SelectedOptionPathProperty = AvaloniaProperty.RegisterDirect( @@ -207,12 +207,12 @@ public class Cascader : AbstractSelect, IControlSharedTokenResourcesHost set => SetAndRaise(IsMaxSelectReachedProperty, ref _isMaxSelectReached, value); } - private IList? _effectiveCheckedOptions; + private IList? _effectiveSelectedOptions; - internal IList? EffectiveCheckedOptions + internal IList? EffectiveSelectedOptions { - get => _effectiveCheckedOptions; - set => SetAndRaise(EffectiveCheckedOptionsProperty, ref _effectiveCheckedOptions, value); + get => _effectiveSelectedOptions; + set => SetAndRaise(EffectiveSelectedOptionsProperty, ref _effectiveSelectedOptions, value); } private string? _selectOptionPath; @@ -231,7 +231,7 @@ public class Cascader : AbstractSelect, IControlSharedTokenResourcesHost private readonly ItemCollection _options = new(); private SelectFilterTextBox? _singleFilterInput; private CascaderView? _cascaderView; - private bool _needSkipSyncCheckedOptions; + private bool _needSkipSyncSelectedOptions; static Cascader() { @@ -280,14 +280,14 @@ public class Cascader : AbstractSelect, IControlSharedTokenResourcesHost { SelectedOption = null; SelectedOptionPath = null; - CheckedOptions = null; + SelectedOptions = null; } private void ConfigurePlaceholderVisible() { if (IsMultiple) { - SetCurrentValue(IsPlaceholderTextVisibleProperty, (CheckedOptions == null || CheckedOptions?.Count == 0) && + SetCurrentValue(IsPlaceholderTextVisibleProperty, (SelectedOptions == null || SelectedOptions?.Count == 0) && string.IsNullOrWhiteSpace(ActivateFilterValue) && string.IsNullOrWhiteSpace(SelectedOptionPath)); } @@ -368,7 +368,7 @@ public class Cascader : AbstractSelect, IControlSharedTokenResourcesHost { ConfigurePopupMinWith(DesiredSize.Width); } - else if (change.Property == CheckedOptionsProperty || + else if (change.Property == SelectedOptionsProperty || change.Property == SelectedOptionProperty || change.Property == SelectedOptionPathProperty || change.Property == IsMultipleProperty) @@ -377,7 +377,7 @@ public class Cascader : AbstractSelect, IControlSharedTokenResourcesHost ConfigureSelectionIsEmpty(); if (IsMultiple) { - SetCurrentValue(SelectedCountProperty, CheckedOptions?.Count ?? 0); + SetCurrentValue(SelectedCountProperty, SelectedOptions?.Count ?? 0); } else { @@ -385,21 +385,21 @@ public class Cascader : AbstractSelect, IControlSharedTokenResourcesHost } } - if (change.Property == CheckedOptionsProperty || + if (change.Property == SelectedOptionsProperty || change.Property == IsMultipleProperty) { - SyncCheckedOptionsToCascaderView(); + SyncSelectedOptionsToCascaderView(); } if (change.Property == IsMultipleProperty || change.Property == MaxCountProperty || - change.Property == EffectiveCheckedOptionsProperty || + change.Property == EffectiveSelectedOptionsProperty || change.Property == IsMultipleProperty) { ConfigureMaxSelectReached(); } - if (change.Property == CheckedOptionsProperty || + if (change.Property == SelectedOptionsProperty || change.Property == ShowCheckedStrategyProperty) { BuildEffectiveSelectedOptions(); @@ -423,7 +423,7 @@ public class Cascader : AbstractSelect, IControlSharedTokenResourcesHost if (_cascaderView != null) { - _cascaderView.CheckedOptionsChanged -= HandleCascaderViewItemsCheckedChanged; + _cascaderView.SelectedOptionsChanged -= HandleCascaderViewItemsCheckedChanged; _cascaderView.ItemDoubleClicked -= HandleCascaderViewItemDoubleClicked; _cascaderView.ItemClicked -= HandleCascaderViewItemClicked; _cascaderView.OptionSelected -= HandleCascaderViewItemSelected; @@ -436,7 +436,7 @@ public class Cascader : AbstractSelect, IControlSharedTokenResourcesHost if (_cascaderView != null) { - _cascaderView.CheckedOptionsChanged += HandleCascaderViewItemsCheckedChanged; + _cascaderView.SelectedOptionsChanged += HandleCascaderViewItemsCheckedChanged; _cascaderView.ItemDoubleClicked += HandleCascaderViewItemDoubleClicked; _cascaderView.ItemClicked += HandleCascaderViewItemClicked; _cascaderView.OptionSelected += HandleCascaderViewItemSelected; @@ -486,7 +486,7 @@ public class Cascader : AbstractSelect, IControlSharedTokenResourcesHost } } - private void HandleCascaderViewItemsCheckedChanged(object? sender, CascaderViewCheckedOptionsChangedEventArgs e) + private void HandleCascaderViewItemsCheckedChanged(object? sender, CascaderOptionsSelectedChangedEventArgs e) { if (_cascaderView == null) { @@ -495,14 +495,14 @@ public class Cascader : AbstractSelect, IControlSharedTokenResourcesHost var needSync = false; HashSet? cascaderViewSet = null; - if (_checkedOptions == null || _checkedOptions?.Count != _cascaderView.CheckedOptions?.Count) + if (_checkedOptions == null || _checkedOptions?.Count != _cascaderView.SelectedOptions?.Count) { needSync = true; } else { var currentSet = _checkedOptions?.Cast().ToHashSet() ?? new HashSet(); - cascaderViewSet = _cascaderView?.CheckedOptions?.Cast().ToHashSet() ?? new HashSet(); + cascaderViewSet = _cascaderView?.SelectedOptions?.Cast().ToHashSet() ?? new HashSet(); if (!currentSet.SetEquals(cascaderViewSet)) { needSync = true; @@ -513,17 +513,17 @@ public class Cascader : AbstractSelect, IControlSharedTokenResourcesHost { try { - _needSkipSyncCheckedOptions = true; - cascaderViewSet ??= _cascaderView?.CheckedOptions?.Cast().ToHashSet(); + _needSkipSyncSelectedOptions = true; + cascaderViewSet ??= _cascaderView?.SelectedOptions?.Cast().ToHashSet(); if (cascaderViewSet != null) { - CheckedOptions = cascaderViewSet.ToList(); + SelectedOptions = cascaderViewSet.ToList(); } } finally { - _needSkipSyncCheckedOptions = false; + _needSkipSyncSelectedOptions = false; } } } @@ -540,7 +540,7 @@ public class Cascader : AbstractSelect, IControlSharedTokenResourcesHost { if (IsMultiple) { - SetCurrentValue(IsSelectionEmptyProperty, CheckedOptions == null || CheckedOptions?.Count == 0); + SetCurrentValue(IsSelectionEmptyProperty, SelectedOptions == null || SelectedOptions?.Count == 0); } else { @@ -699,7 +699,7 @@ public class Cascader : AbstractSelect, IControlSharedTokenResourcesHost { if (IsMultiple) { - IsMaxSelectReached = MaxCount <= CheckedOptions?.Count; + IsMaxSelectReached = MaxCount <= SelectedOptions?.Count; } else { @@ -713,13 +713,13 @@ public class Cascader : AbstractSelect, IControlSharedTokenResourcesHost { try { - _needSkipSyncCheckedOptions = true; + _needSkipSyncSelectedOptions = true; _cascaderView.SelectedOption = null; - _cascaderView.CheckedOptions = null; + _cascaderView.SelectedOptions = null; } finally { - _needSkipSyncCheckedOptions = false; + _needSkipSyncSelectedOptions = false; } } } @@ -732,15 +732,15 @@ public class Cascader : AbstractSelect, IControlSharedTokenResourcesHost } if (e.Source is SelectTag tag && tag.Item is ICascaderOption viewOption) { - if (CheckedOptions != null) + if (SelectedOptions != null) { var checkedOptions = new List(); - foreach (var option in CheckedOptions) + foreach (var option in SelectedOptions) { checkedOptions.Add(option); } RemoveOptionRecursive(checkedOptions, viewOption); - CheckedOptions = checkedOptions; + SelectedOptions = checkedOptions; } } e.Handled = true; @@ -755,46 +755,46 @@ public class Cascader : AbstractSelect, IControlSharedTokenResourcesHost options.Remove(option); } - private void SyncCheckedOptionsToCascaderView() + private void SyncSelectedOptionsToCascaderView() { - if (!_needSkipSyncCheckedOptions) + if (!_needSkipSyncSelectedOptions) { if (_cascaderView != null) { - if (CheckedOptions != null && IsMultiple) + if (SelectedOptions != null && IsMultiple) { - if (_cascaderView.CheckedOptions == null) + if (_cascaderView.SelectedOptions == null) { var checkedOptions = new List(); - checkedOptions.AddRange(CheckedOptions); - _cascaderView.CheckedOptions = checkedOptions; + checkedOptions.AddRange(SelectedOptions); + _cascaderView.SelectedOptions = checkedOptions; } else { - var cascaderViewSet = _cascaderView.CheckedOptions.ToHashSet(); - var currentSet = CheckedOptions.ToHashSet(); + var cascaderViewSet = _cascaderView.SelectedOptions.ToHashSet(); + var currentSet = SelectedOptions.ToHashSet(); var deletedOptions = cascaderViewSet.Except(currentSet); var addedOptions = currentSet.Except(cascaderViewSet); - var currentCheckedOptions = new List(); - currentCheckedOptions.AddRange(_cascaderView.CheckedOptions); + var currentSelectedOptions = new List(); + currentSelectedOptions.AddRange(_cascaderView.SelectedOptions); foreach (var option in deletedOptions) { - currentCheckedOptions.Remove(option); + currentSelectedOptions.Remove(option); } foreach (var option in addedOptions) { - currentCheckedOptions.Add(option); + currentSelectedOptions.Add(option); } - _cascaderView.CheckedOptions = currentCheckedOptions; + _cascaderView.SelectedOptions = currentSelectedOptions; } } else { _cascaderView.SelectedOption = null; - _cascaderView.CheckedOptions = null; + _cascaderView.SelectedOptions = null; } } } @@ -802,22 +802,22 @@ public class Cascader : AbstractSelect, IControlSharedTokenResourcesHost private void BuildEffectiveSelectedOptions() { - if (CheckedOptions != null) + if (SelectedOptions != null) { if (ShowCheckedStrategy == TreeSelectCheckedStrategy.All) { - EffectiveCheckedOptions = CheckedOptions; + EffectiveSelectedOptions = SelectedOptions; } else { var effectiveSelectedOptions = new List(); if (ShowCheckedStrategy.HasFlag(TreeSelectCheckedStrategy.ShowParent)) { - var selectedSet = CheckedOptions.Cast().ToHashSet(); - var fullySelectedParents = CheckedOptions + var selectedSet = SelectedOptions.Cast().ToHashSet(); + var fullySelectedParents = SelectedOptions .Where(node => node.Children.All(child => selectedSet.Contains(child))) .ToHashSet(); - foreach (var option in CheckedOptions) + foreach (var option in SelectedOptions) { bool isDescendantOfFullySelectedParent = fullySelectedParents .Any(parent => IsDescendantOf(option, parent)); @@ -830,7 +830,7 @@ public class Cascader : AbstractSelect, IControlSharedTokenResourcesHost } if (ShowCheckedStrategy.HasFlag(TreeSelectCheckedStrategy.ShowChild)) { - foreach (var option in CheckedOptions) + foreach (var option in SelectedOptions) { if (option.Children.Count == 0) { @@ -838,12 +838,12 @@ public class Cascader : AbstractSelect, IControlSharedTokenResourcesHost } } } - EffectiveCheckedOptions = effectiveSelectedOptions; + EffectiveSelectedOptions = effectiveSelectedOptions; } } else { - EffectiveCheckedOptions = null; + EffectiveSelectedOptions = null; } } @@ -913,4 +913,40 @@ public class Cascader : AbstractSelect, IControlSharedTokenResourcesHost } } } + + #region 实现 FormItem 接口 + + // protected override void NotifySetFormValue(object? value) + // { + // if (Mode == SelectMode.Single) + // { + // SelectedOption = value as ISelectOption; + // } + // else + // { + // SelectedOptions = value as IList; + // } + // } + // + // protected override object? NotifyGetFormValue() + // { + // if (Mode == SelectMode.Single) + // { + // return SelectedOption; + // } + // return SelectedOptions; + // } + // + // protected override void NotifyClearFormValue() + // { + // if (Mode == SelectMode.Single) + // { + // SelectedOption = null; + // } + // else + // { + // SelectedOptions = null; + // } + // } + #endregion } \ No newline at end of file diff --git a/src/AtomUI.Desktop.Controls/Cascader/CascaderView.Check.cs b/src/AtomUI.Desktop.Controls/Cascader/CascaderView.Check.cs index 2cee50ee8..2486ce247 100644 --- a/src/AtomUI.Desktop.Controls/Cascader/CascaderView.Check.cs +++ b/src/AtomUI.Desktop.Controls/Cascader/CascaderView.Check.cs @@ -8,7 +8,7 @@ public partial class CascaderView { private static void SetupChecked() { - CheckedOptionsProperty.Changed.AddClassHandler((view, e) => view.HandleCheckedOptionsChanged(e)); + SelectedOptionsProperty.Changed.AddClassHandler((view, e) => view.HandleSelectedOptionsChanged(e)); CascaderViewItem.CheckedEvent.AddClassHandler((view, e) => view.HandleCascaderItemCheckedChanged(e)); } @@ -27,31 +27,31 @@ public partial class CascaderView } } - private void HandleCheckedOptionsChanged(AvaloniaPropertyChangedEventArgs args) + private void HandleSelectedOptionsChanged(AvaloniaPropertyChangedEventArgs args) { - var oldCheckedOptions = args.OldValue as IList; - var newCheckedOptions = args.NewValue as IList; - CheckedOptionsChanged?.Invoke(this, new CascaderViewCheckedOptionsChangedEventArgs( - oldCheckedOptions, - newCheckedOptions)); + var oldSelectedOptions = args.OldValue as IList; + var newSelectedOptions = args.NewValue as IList; + SelectedOptionsChanged?.Invoke(this, new CascaderOptionsSelectedChangedEventArgs( + oldSelectedOptions, + newSelectedOptions)); - if (_ignoreSyncCheckedOptions) + if (_ignoreSyncSelectedOptions) { - _ignoreSyncCheckedOptions = false; + _ignoreSyncSelectedOptions = false; return; } - if (oldCheckedOptions != null) + if (oldSelectedOptions != null) { - foreach (var oldItem in oldCheckedOptions) + foreach (var oldItem in oldSelectedOptions) { UnCheckedSubTree(oldItem); } } - if (newCheckedOptions != null) + if (newSelectedOptions != null) { - foreach (var newItem in newCheckedOptions) + foreach (var newItem in newSelectedOptions) { CheckedSubTree(newItem); } @@ -77,28 +77,28 @@ public partial class CascaderView } ISet checkedOptions = DoCheckedSubTree(viewOption); - var originCheckedOptions = new HashSet(); - if (CheckedOptions != null) + var originSelectedOptions = new HashSet(); + if (SelectedOptions != null) { - foreach (var checkedItem in CheckedOptions) + foreach (var checkedItem in SelectedOptions) { - originCheckedOptions.Add(checkedItem); + originSelectedOptions.Add(checkedItem); } } - var newCheckedOptions = new HashSet(); - foreach (var checkedItem in originCheckedOptions) + var newSelectedOptions = new HashSet(); + foreach (var checkedItem in originSelectedOptions) { - newCheckedOptions.Add(checkedItem); + newSelectedOptions.Add(checkedItem); } foreach (var checkedItem in checkedOptions) { - newCheckedOptions.Add(checkedItem); + newSelectedOptions.Add(checkedItem); } - if (!newCheckedOptions.SetEquals(originCheckedOptions)) + if (!newSelectedOptions.SetEquals(originSelectedOptions)) { - _ignoreSyncCheckedOptions = true; - CheckedOptions = newCheckedOptions.ToList(); + _ignoreSyncSelectedOptions = true; + SelectedOptions = newSelectedOptions.ToList(); } } @@ -113,8 +113,8 @@ public partial class CascaderView if ((container != null && container.IsEffectiveCheckable()) || (childItem.IsEnabled && childItem.IsCheckBoxEnabled)) { - var childCheckedOptions = DoCheckedSubTree(childItem); - checkedOptions.UnionWith(childCheckedOptions); + var childSelectedOptions = DoCheckedSubTree(childItem); + checkedOptions.UnionWith(childSelectedOptions); } } @@ -166,40 +166,40 @@ public partial class CascaderView return; } - ISet unCheckedOptions = DoUnCheckedSubTree(viewOption); + ISet unSelectedOptions = DoUnCheckedSubTree(viewOption); - var originCheckedOptions = new HashSet(); - if (CheckedOptions != null) + var originSelectedOptions = new HashSet(); + if (SelectedOptions != null) { - foreach (var checkedItem in CheckedOptions) + foreach (var checkedItem in SelectedOptions) { - originCheckedOptions.Add(checkedItem); + originSelectedOptions.Add(checkedItem); } } - var newCheckedOptions = new HashSet(); - foreach (var checkedItem in originCheckedOptions) + var newSelectedOptions = new HashSet(); + foreach (var checkedItem in originSelectedOptions) { - newCheckedOptions.Add(checkedItem); + newSelectedOptions.Add(checkedItem); } - foreach (var unCheckedItem in unCheckedOptions) + foreach (var unCheckedItem in unSelectedOptions) { - newCheckedOptions.Remove(unCheckedItem); + newSelectedOptions.Remove(unCheckedItem); } - if (!newCheckedOptions.SetEquals(originCheckedOptions)) + if (!newSelectedOptions.SetEquals(originSelectedOptions)) { - _ignoreSyncCheckedOptions = true; - CheckedOptions = newCheckedOptions.ToList(); + _ignoreSyncSelectedOptions = true; + SelectedOptions = newSelectedOptions.ToList(); } } public ISet DoUnCheckedSubTree(ICascaderOption viewOption) { - var unCheckedOptions = new HashSet(); + var unSelectedOptions = new HashSet(); MarkViewOptionChecked(viewOption, false); - unCheckedOptions.Add(viewOption); + unSelectedOptions.Add(viewOption); foreach (var childItem in viewOption.Children) { @@ -207,13 +207,13 @@ public partial class CascaderView if ((container != null && container.IsEffectiveCheckable()) || (childItem.IsEnabled && childItem.IsCheckBoxEnabled)) { - var childCheckedOptions = DoUnCheckedSubTree(childItem); - unCheckedOptions.UnionWith(childCheckedOptions); + var childSelectedOptions = DoUnCheckedSubTree(childItem); + unSelectedOptions.UnionWith(childSelectedOptions); } } var (_, unCheckedParentItems) = SetupParentNodeCheckedStatus(viewOption); - unCheckedOptions.UnionWith(unCheckedParentItems); - return unCheckedOptions; + unSelectedOptions.UnionWith(unCheckedParentItems); + return unSelectedOptions; } private (ISet, ISet) SetupParentNodeCheckedStatus(ICascaderOption viewOption) @@ -302,7 +302,7 @@ public partial class CascaderView { case NotifyCollectionChangedAction.Remove: case NotifyCollectionChangedAction.Replace: - if (CheckedOptions != null) + if (SelectedOptions != null) { if (e.OldItems != null) { @@ -315,7 +315,7 @@ public partial class CascaderView } } var tobeRemoved = new List(); - foreach (var checkedItem in CheckedOptions) + foreach (var checkedItem in SelectedOptions) { if (removedItemsClosure.Contains(checkedItem)) { @@ -325,13 +325,13 @@ public partial class CascaderView foreach (var removedItem in tobeRemoved) { - CheckedOptions.Remove(removedItem); + SelectedOptions.Remove(removedItem); } } } break; case NotifyCollectionChangedAction.Reset: - CheckedOptions = null; + SelectedOptions = null; break; } FilterItems(); diff --git a/src/AtomUI.Desktop.Controls/Cascader/CascaderView.cs b/src/AtomUI.Desktop.Controls/Cascader/CascaderView.cs index bcaff4e4a..f29a388e4 100644 --- a/src/AtomUI.Desktop.Controls/Cascader/CascaderView.cs +++ b/src/AtomUI.Desktop.Controls/Cascader/CascaderView.cs @@ -97,11 +97,11 @@ public partial class CascaderView : TemplatedControl, o => o.SelectedOption, (o, v) => o.SelectedOption = v); - public static readonly DirectProperty?> CheckedOptionsProperty = + public static readonly DirectProperty?> SelectedOptionsProperty = AvaloniaProperty.RegisterDirect?>( - nameof(CheckedOptions), - o => o.CheckedOptions, - (o, v) => o.CheckedOptions = v); + nameof(SelectedOptions), + o => o.SelectedOptions, + (o, v) => o.SelectedOptions = v); public IEnumerable? OptionsSource { @@ -234,10 +234,10 @@ public partial class CascaderView : TemplatedControl, private IList? _checkedOptions; - public IList? CheckedOptions + public IList? SelectedOptions { get => _checkedOptions; - set => SetAndRaise(CheckedOptionsProperty, ref _checkedOptions, value); + set => SetAndRaise(SelectedOptionsProperty, ref _checkedOptions, value); } public OptionsSourceView OptionsView => _options; @@ -249,7 +249,7 @@ public partial class CascaderView : TemplatedControl, #region 公共事件定义 - public event EventHandler? CheckedOptionsChanged; + public event EventHandler? SelectedOptionsChanged; public event EventHandler? ItemAsyncLoaded; public event EventHandler? ItemExpanded; public event EventHandler? ItemCollapsed; @@ -305,7 +305,7 @@ public partial class CascaderView : TemplatedControl, private readonly ItemCollection _options = new(); private static readonly IList Empty = Array.Empty(); - private bool _ignoreSyncCheckedOptions; + private bool _ignoreSyncSelectedOptions; private StackPanel? _itemsPanel; private int _ignoreExpandAndCollapseLevel; private bool _defaultExpandPathApplied; diff --git a/src/AtomUI.Desktop.Controls/Cascader/EventArgs/CascaderViewCheckedOptionsChangedEventArgs.cs b/src/AtomUI.Desktop.Controls/Cascader/EventArgs/CascaderOptionsSelectedChangedEventArgs.cs similarity index 54% rename from src/AtomUI.Desktop.Controls/Cascader/EventArgs/CascaderViewCheckedOptionsChangedEventArgs.cs rename to src/AtomUI.Desktop.Controls/Cascader/EventArgs/CascaderOptionsSelectedChangedEventArgs.cs index 663612c21..60c56f67e 100644 --- a/src/AtomUI.Desktop.Controls/Cascader/EventArgs/CascaderViewCheckedOptionsChangedEventArgs.cs +++ b/src/AtomUI.Desktop.Controls/Cascader/EventArgs/CascaderOptionsSelectedChangedEventArgs.cs @@ -1,11 +1,11 @@ namespace AtomUI.Desktop.Controls; -public class CascaderViewCheckedOptionsChangedEventArgs : EventArgs +public class CascaderOptionsSelectedChangedEventArgs : EventArgs { public IList? OldOptions { get; } public IList? NewOptions { get; } - public CascaderViewCheckedOptionsChangedEventArgs(IList? oldOptions, IList? newOptions) + public CascaderOptionsSelectedChangedEventArgs(IList? oldOptions, IList? newOptions) { OldOptions = oldOptions; NewOptions = newOptions; diff --git a/src/AtomUI.Desktop.Controls/Cascader/Themes/CascaderTheme.axaml b/src/AtomUI.Desktop.Controls/Cascader/Themes/CascaderTheme.axaml index 709079417..3f7adf8b7 100644 --- a/src/AtomUI.Desktop.Controls/Cascader/Themes/CascaderTheme.axaml +++ b/src/AtomUI.Desktop.Controls/Cascader/Themes/CascaderTheme.axaml @@ -75,7 +75,7 @@ HorizontalAlignment="Stretch" VerticalAlignment="Center" SizeType="{TemplateBinding SizeType}" - SelectedItems="{TemplateBinding EffectiveCheckedOptions}" + SelectedItems="{TemplateBinding EffectiveSelectedOptions}" IsFilterEnabled="{TemplateBinding IsFilterEnabled}" IsDropDownOpen="{TemplateBinding IsDropDownOpen}" MaxTagCount="{TemplateBinding MaxTagCount}" diff --git a/src/AtomUI.Desktop.Controls/Select/AbstractSelect.cs b/src/AtomUI.Desktop.Controls/Select/AbstractSelect.cs index 1a21aef6a..125af8a4f 100644 --- a/src/AtomUI.Desktop.Controls/Select/AbstractSelect.cs +++ b/src/AtomUI.Desktop.Controls/Select/AbstractSelect.cs @@ -926,6 +926,18 @@ public class AbstractSelect : TemplatedControl, protected virtual void NotifyValidateStatus(FormValidateStatus status) { + if (status == FormValidateStatus.Error) + { + SetCurrentValue(StatusProperty, AddOnDecoratedStatus.Error); + } + else if (status == FormValidateStatus.Warning) + { + SetCurrentValue(StatusProperty, AddOnDecoratedStatus.Warning); + } + else + { + SetCurrentValue(StatusProperty, AddOnDecoratedStatus.Default); + } } #endregion } \ No newline at end of file