From 6993cdd7ab29dce81313b256e3fd700eb7481041 Mon Sep 17 00:00:00 2001 From: rabbitism Date: Tue, 26 Mar 2024 01:47:53 +0800 Subject: [PATCH] feat: remove virtualization subscription feature to avoid potential issue of --- src/Ursa/Controls/ComboBox/MultiComboBox.cs | 28 +----------------- .../Controls/ComboBox/MultiComboBoxItem.cs | 29 ++++++++++++++++++- 2 files changed, 29 insertions(+), 28 deletions(-) diff --git a/src/Ursa/Controls/ComboBox/MultiComboBox.cs b/src/Ursa/Controls/ComboBox/MultiComboBox.cs index 8b141f1..075e5d1 100644 --- a/src/Ursa/Controls/ComboBox/MultiComboBox.cs +++ b/src/Ursa/Controls/ComboBox/MultiComboBox.cs @@ -7,6 +7,7 @@ using Avalonia.Controls; using Avalonia.Controls.Metadata; using Avalonia.Controls.Primitives; using Avalonia.Controls.Templates; +using Avalonia.Interactivity; using Irihi.Avalonia.Shared.Helpers; namespace Ursa.Controls; @@ -59,35 +60,9 @@ public class MultiComboBox: SelectingItemsControl return new MultiComboBoxItem(); } - private Dictionary _disposables = new Dictionary(); - protected override void PrepareContainerForItemOverride(Control container, object? item, int index) { base.PrepareContainerForItemOverride(container, item, index); - if(_disposables.TryGetValue(index, out var d)) - { - d?.Dispose(); - _disposables.Remove(index); - } - if (container is MultiComboBoxItem comboBoxItem) - { - comboBoxItem.IsSelected = SelectedItems?.Contains(item) ?? false; - var disposable = MultiComboBoxItem.IsSelectedProperty.Changed.Subscribe(a => - { - if (a.Sender == comboBoxItem) - { - if (comboBoxItem.IsSelected) - { - SelectedItems?.Add(item); - } - else - { - SelectedItems?.Remove(item); - } - } - }); - _disposables[index] = disposable; - } } internal void ItemFocused(MultiComboBoxItem dropDownItem) @@ -97,5 +72,4 @@ public class MultiComboBox: SelectingItemsControl dropDownItem.BringIntoView(); } } - } \ No newline at end of file diff --git a/src/Ursa/Controls/ComboBox/MultiComboBoxItem.cs b/src/Ursa/Controls/ComboBox/MultiComboBoxItem.cs index 51202b4..a340d20 100644 --- a/src/Ursa/Controls/ComboBox/MultiComboBoxItem.cs +++ b/src/Ursa/Controls/ComboBox/MultiComboBoxItem.cs @@ -2,12 +2,15 @@ using Avalonia.Controls; using Avalonia.Controls.Mixins; using Avalonia.Input; +using Avalonia.LogicalTree; using Irihi.Avalonia.Shared.Helpers; namespace Ursa.Controls; public class MultiComboBoxItem: ContentControl { + private MultiComboBox? _parent; + public static readonly StyledProperty IsSelectedProperty = AvaloniaProperty.Register( nameof(IsSelected)); @@ -22,7 +25,23 @@ public class MultiComboBoxItem: ContentControl IsSelectedProperty.AffectsPseudoClass(":selected"); PressedMixin.Attach(); FocusableProperty.OverrideDefaultValue(true); + IsSelectedProperty.Changed.AddClassHandler((item, args) => + item.OnSelectionChanged(args)); } + + private void OnSelectionChanged(AvaloniaPropertyChangedEventArgs args) + { + var parent = this.FindLogicalAncestorOfType(); + if (args.NewValue.Value) + { + parent?.SelectedItems?.Add(this.DataContext); + } + else + { + parent?.SelectedItems?.Remove(this.DataContext); + } + } + public MultiComboBoxItem() { this.GetObservable(IsFocusedProperty).Subscribe(a=> { @@ -32,7 +51,15 @@ public class MultiComboBoxItem: ContentControl } }); } - + + protected override void OnAttachedToLogicalTree(LogicalTreeAttachmentEventArgs e) + { + base.OnAttachedToLogicalTree(e); + _parent = this.FindLogicalAncestorOfType(); + if(this.IsSelected) + _parent?.SelectedItems?.Add(this.DataContext); + } + protected override void OnPointerPressed(PointerPressedEventArgs e) { base.OnPointerPressed(e);