fix: Prevent duplicate items in MultiComboBox SelectedItems by adding existence check

This commit is contained in:
ejihuang
2025-07-21 10:03:38 +08:00
parent c78abad56b
commit bb16500f08

View File

@@ -15,7 +15,7 @@ public class MultiComboBoxItem: ContentControl
private static readonly Point s_invalidPoint = new (double.NaN, double.NaN); private static readonly Point s_invalidPoint = new (double.NaN, double.NaN);
private Point _pointerDownPoint = s_invalidPoint; private Point _pointerDownPoint = s_invalidPoint;
private bool _updateInternal; private bool _updateInternal;
public static readonly StyledProperty<bool> IsSelectedProperty = AvaloniaProperty.Register<MultiComboBoxItem, bool>( public static readonly StyledProperty<bool> IsSelectedProperty = AvaloniaProperty.Register<MultiComboBoxItem, bool>(
nameof(IsSelected)); nameof(IsSelected));
@@ -24,7 +24,7 @@ public class MultiComboBoxItem: ContentControl
get => GetValue(IsSelectedProperty); get => GetValue(IsSelectedProperty);
set => SetValue(IsSelectedProperty, value); set => SetValue(IsSelectedProperty, value);
} }
static MultiComboBoxItem() static MultiComboBoxItem()
{ {
IsSelectedProperty.AffectsPseudoClass<MultiComboBoxItem>(PseudoClassName.PC_Selected); IsSelectedProperty.AffectsPseudoClass<MultiComboBoxItem>(PseudoClassName.PC_Selected);
@@ -52,8 +52,13 @@ public class MultiComboBoxItem: ContentControl
{ {
base.OnAttachedToLogicalTree(e); base.OnAttachedToLogicalTree(e);
_parent = this.FindLogicalAncestorOfType<MultiComboBox>(); _parent = this.FindLogicalAncestorOfType<MultiComboBox>();
if(this.IsSelected) if (this.IsSelected &&
_parent?.SelectedItems?.Add(this.DataContext); _parent is not null &&
_parent.SelectedItems is not null &&
!_parent.SelectedItems.Contains(this.DataContext))
{
_parent.SelectedItems.Add(this.DataContext);
}
} }
protected override void OnPointerPressed(PointerPressedEventArgs e) protected override void OnPointerPressed(PointerPressedEventArgs e)
@@ -103,7 +108,7 @@ public class MultiComboBoxItem: ContentControl
base.OnAttachedToVisualTree(e); base.OnAttachedToVisualTree(e);
UpdateSelection(); UpdateSelection();
} }
internal void UpdateSelection() internal void UpdateSelection()
{ {
_updateInternal = true; _updateInternal = true;