mirror of
https://github.com/AtomUI/AtomUI.git
synced 2026-10-29 07:16:33 +08:00
Refactor(Cascader): Refactor CheckedOptions -> SelectedOptions
This commit is contained in:
@@ -45,11 +45,11 @@ public class Cascader : AbstractSelect, IControlSharedTokenResourcesHost
|
||||
o => o.SelectedOption,
|
||||
(o, v) => o.SelectedOption = v);
|
||||
|
||||
public static readonly DirectProperty<CascaderView, IList<ICascaderOption>?> CheckedOptionsProperty =
|
||||
AvaloniaProperty.RegisterDirect<CascaderView, IList<ICascaderOption>?>(
|
||||
nameof(CheckedOptions),
|
||||
o => o.CheckedOptions,
|
||||
(o, v) => o.CheckedOptions = v);
|
||||
public static readonly DirectProperty<Cascader, IList<ICascaderOption>?> SelectedOptionsProperty =
|
||||
AvaloniaProperty.RegisterDirect<Cascader, IList<ICascaderOption>?>(
|
||||
nameof(SelectedOptions),
|
||||
o => o.SelectedOptions,
|
||||
(o, v) => o.SelectedOptions = v);
|
||||
|
||||
public static readonly StyledProperty<IconTemplate?> ExpandIconProperty =
|
||||
CascaderView.ExpandIconProperty.AddOwner<Cascader>();
|
||||
@@ -113,10 +113,10 @@ public class Cascader : AbstractSelect, IControlSharedTokenResourcesHost
|
||||
|
||||
private IList<ICascaderOption>? _checkedOptions;
|
||||
|
||||
public IList<ICascaderOption>? CheckedOptions
|
||||
public IList<ICascaderOption>? 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<Cascader, IList<ICascaderOption>?> EffectiveCheckedOptionsProperty =
|
||||
internal static readonly DirectProperty<Cascader, IList<ICascaderOption>?> EffectiveSelectedOptionsProperty =
|
||||
AvaloniaProperty.RegisterDirect<Cascader, IList<ICascaderOption>?>(
|
||||
nameof(EffectiveCheckedOptions),
|
||||
o => o.EffectiveCheckedOptions,
|
||||
(o, v) => o.EffectiveCheckedOptions = v);
|
||||
nameof(EffectiveSelectedOptions),
|
||||
o => o.EffectiveSelectedOptions,
|
||||
(o, v) => o.EffectiveSelectedOptions = v);
|
||||
|
||||
internal static readonly DirectProperty<Cascader, string?> SelectedOptionPathProperty =
|
||||
AvaloniaProperty.RegisterDirect<Cascader, string?>(
|
||||
@@ -207,12 +207,12 @@ public class Cascader : AbstractSelect, IControlSharedTokenResourcesHost
|
||||
set => SetAndRaise(IsMaxSelectReachedProperty, ref _isMaxSelectReached, value);
|
||||
}
|
||||
|
||||
private IList<ICascaderOption>? _effectiveCheckedOptions;
|
||||
private IList<ICascaderOption>? _effectiveSelectedOptions;
|
||||
|
||||
internal IList<ICascaderOption>? EffectiveCheckedOptions
|
||||
internal IList<ICascaderOption>? 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<ICascaderOption>? 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<ICascaderOption>().ToHashSet() ?? new HashSet<ICascaderOption>();
|
||||
cascaderViewSet = _cascaderView?.CheckedOptions?.Cast<ICascaderOption>().ToHashSet() ?? new HashSet<ICascaderOption>();
|
||||
cascaderViewSet = _cascaderView?.SelectedOptions?.Cast<ICascaderOption>().ToHashSet() ?? new HashSet<ICascaderOption>();
|
||||
if (!currentSet.SetEquals(cascaderViewSet))
|
||||
{
|
||||
needSync = true;
|
||||
@@ -513,17 +513,17 @@ public class Cascader : AbstractSelect, IControlSharedTokenResourcesHost
|
||||
{
|
||||
try
|
||||
{
|
||||
_needSkipSyncCheckedOptions = true;
|
||||
cascaderViewSet ??= _cascaderView?.CheckedOptions?.Cast<ICascaderOption>().ToHashSet();
|
||||
_needSkipSyncSelectedOptions = true;
|
||||
cascaderViewSet ??= _cascaderView?.SelectedOptions?.Cast<ICascaderOption>().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<ICascaderOption>();
|
||||
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<ICascaderOption>();
|
||||
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<ICascaderOption>();
|
||||
currentCheckedOptions.AddRange(_cascaderView.CheckedOptions);
|
||||
var currentSelectedOptions = new List<ICascaderOption>();
|
||||
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<ICascaderOption>();
|
||||
if (ShowCheckedStrategy.HasFlag(TreeSelectCheckedStrategy.ShowParent))
|
||||
{
|
||||
var selectedSet = CheckedOptions.Cast<object>().ToHashSet();
|
||||
var fullySelectedParents = CheckedOptions
|
||||
var selectedSet = SelectedOptions.Cast<object>().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<ISelectOption>;
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// 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
|
||||
}
|
||||
@@ -8,7 +8,7 @@ public partial class CascaderView
|
||||
{
|
||||
private static void SetupChecked()
|
||||
{
|
||||
CheckedOptionsProperty.Changed.AddClassHandler<CascaderView>((view, e) => view.HandleCheckedOptionsChanged(e));
|
||||
SelectedOptionsProperty.Changed.AddClassHandler<CascaderView>((view, e) => view.HandleSelectedOptionsChanged(e));
|
||||
CascaderViewItem.CheckedEvent.AddClassHandler<CascaderView>((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<ICascaderOption>;
|
||||
var newCheckedOptions = args.NewValue as IList<ICascaderOption>;
|
||||
CheckedOptionsChanged?.Invoke(this, new CascaderViewCheckedOptionsChangedEventArgs(
|
||||
oldCheckedOptions,
|
||||
newCheckedOptions));
|
||||
var oldSelectedOptions = args.OldValue as IList<ICascaderOption>;
|
||||
var newSelectedOptions = args.NewValue as IList<ICascaderOption>;
|
||||
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<ICascaderOption> checkedOptions = DoCheckedSubTree(viewOption);
|
||||
var originCheckedOptions = new HashSet<ICascaderOption>();
|
||||
if (CheckedOptions != null)
|
||||
var originSelectedOptions = new HashSet<ICascaderOption>();
|
||||
if (SelectedOptions != null)
|
||||
{
|
||||
foreach (var checkedItem in CheckedOptions)
|
||||
foreach (var checkedItem in SelectedOptions)
|
||||
{
|
||||
originCheckedOptions.Add(checkedItem);
|
||||
originSelectedOptions.Add(checkedItem);
|
||||
}
|
||||
}
|
||||
var newCheckedOptions = new HashSet<ICascaderOption>();
|
||||
foreach (var checkedItem in originCheckedOptions)
|
||||
var newSelectedOptions = new HashSet<ICascaderOption>();
|
||||
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<ICascaderOption> unCheckedOptions = DoUnCheckedSubTree(viewOption);
|
||||
ISet<ICascaderOption> unSelectedOptions = DoUnCheckedSubTree(viewOption);
|
||||
|
||||
var originCheckedOptions = new HashSet<ICascaderOption>();
|
||||
if (CheckedOptions != null)
|
||||
var originSelectedOptions = new HashSet<ICascaderOption>();
|
||||
if (SelectedOptions != null)
|
||||
{
|
||||
foreach (var checkedItem in CheckedOptions)
|
||||
foreach (var checkedItem in SelectedOptions)
|
||||
{
|
||||
originCheckedOptions.Add(checkedItem);
|
||||
originSelectedOptions.Add(checkedItem);
|
||||
}
|
||||
}
|
||||
var newCheckedOptions = new HashSet<ICascaderOption>();
|
||||
foreach (var checkedItem in originCheckedOptions)
|
||||
var newSelectedOptions = new HashSet<ICascaderOption>();
|
||||
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<ICascaderOption> DoUnCheckedSubTree(ICascaderOption viewOption)
|
||||
{
|
||||
var unCheckedOptions = new HashSet<ICascaderOption>();
|
||||
var unSelectedOptions = new HashSet<ICascaderOption>();
|
||||
|
||||
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<ICascaderOption>, ISet<ICascaderOption>) 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<ICascaderOption>();
|
||||
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();
|
||||
|
||||
@@ -97,11 +97,11 @@ public partial class CascaderView : TemplatedControl,
|
||||
o => o.SelectedOption,
|
||||
(o, v) => o.SelectedOption = v);
|
||||
|
||||
public static readonly DirectProperty<CascaderView, IList<ICascaderOption>?> CheckedOptionsProperty =
|
||||
public static readonly DirectProperty<CascaderView, IList<ICascaderOption>?> SelectedOptionsProperty =
|
||||
AvaloniaProperty.RegisterDirect<CascaderView, IList<ICascaderOption>?>(
|
||||
nameof(CheckedOptions),
|
||||
o => o.CheckedOptions,
|
||||
(o, v) => o.CheckedOptions = v);
|
||||
nameof(SelectedOptions),
|
||||
o => o.SelectedOptions,
|
||||
(o, v) => o.SelectedOptions = v);
|
||||
|
||||
public IEnumerable<ICascaderOption>? OptionsSource
|
||||
{
|
||||
@@ -234,10 +234,10 @@ public partial class CascaderView : TemplatedControl,
|
||||
|
||||
private IList<ICascaderOption>? _checkedOptions;
|
||||
|
||||
public IList<ICascaderOption>? CheckedOptions
|
||||
public IList<ICascaderOption>? 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<CascaderViewCheckedOptionsChangedEventArgs>? CheckedOptionsChanged;
|
||||
public event EventHandler<CascaderOptionsSelectedChangedEventArgs>? SelectedOptionsChanged;
|
||||
public event EventHandler<CascaderViewItemLoadedEventArgs>? ItemAsyncLoaded;
|
||||
public event EventHandler<CascaderItemExpandedEventArgs>? ItemExpanded;
|
||||
public event EventHandler<CascaderItemCollapsedEventArgs>? ItemCollapsed;
|
||||
@@ -305,7 +305,7 @@ public partial class CascaderView : TemplatedControl,
|
||||
|
||||
private readonly ItemCollection _options = new();
|
||||
private static readonly IList Empty = Array.Empty<object>();
|
||||
private bool _ignoreSyncCheckedOptions;
|
||||
private bool _ignoreSyncSelectedOptions;
|
||||
private StackPanel? _itemsPanel;
|
||||
private int _ignoreExpandAndCollapseLevel;
|
||||
private bool _defaultExpandPathApplied;
|
||||
|
||||
+2
-2
@@ -1,11 +1,11 @@
|
||||
namespace AtomUI.Desktop.Controls;
|
||||
|
||||
public class CascaderViewCheckedOptionsChangedEventArgs : EventArgs
|
||||
public class CascaderOptionsSelectedChangedEventArgs : EventArgs
|
||||
{
|
||||
public IList<ICascaderOption>? OldOptions { get; }
|
||||
public IList<ICascaderOption>? NewOptions { get; }
|
||||
|
||||
public CascaderViewCheckedOptionsChangedEventArgs(IList<ICascaderOption>? oldOptions, IList<ICascaderOption>? newOptions)
|
||||
public CascaderOptionsSelectedChangedEventArgs(IList<ICascaderOption>? oldOptions, IList<ICascaderOption>? newOptions)
|
||||
{
|
||||
OldOptions = oldOptions;
|
||||
NewOptions = newOptions;
|
||||
@@ -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}"
|
||||
|
||||
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user