فهرست منبع

avalonia: AvaloniaDataGrid multiselect mode now preserves selected items when filtering

Kenric Nugteren 3 هفته پیش
والد
کامیت
64361796bc
1فایلهای تغییر یافته به همراه49 افزوده شده و 3 حذف شده
  1. 49 3
      InABox.Avalonia/Components/AvaloniaDataGrid/AvaloniaDataGrid.axaml.cs

+ 49 - 3
InABox.Avalonia/Components/AvaloniaDataGrid/AvaloniaDataGrid.axaml.cs

@@ -46,6 +46,10 @@ public partial class AvaloniaDataGrid : UserControl, INotifyPropertyChanged
         AvaloniaProperty.Register<AvaloniaDataGrid, AvaloniaDataGridSelectionMode>(nameof(SelectionMode), AvaloniaDataGridSelectionMode.Single);
     public static StyledProperty<double> RowHeightProperty =
         AvaloniaProperty.Register<AvaloniaDataGrid, double>(nameof(RowHeight), 30);
+    public static DirectProperty<AvaloniaDataGrid, IEnumerable<object?>> SelectedItemsProperty =
+        AvaloniaProperty.RegisterDirect<AvaloniaDataGrid, IEnumerable<object?>>(nameof(SelectedItems),
+            grid => grid.SelectedItems,
+            (grid, v) => grid.SelectedItems = v);
 
     public static StyledProperty<AvaloniaDataGridColumns?> ColumnsProperty =
         AvaloniaProperty.Register<AvaloniaDataGrid, AvaloniaDataGridColumns?>(nameof(Columns), null);
@@ -93,7 +97,38 @@ public partial class AvaloniaDataGrid : UserControl, INotifyPropertyChanged
 
     public AvaloniaDataGridColumns Columns { get; private set; }
 
-    public IEnumerable<object?> SelectedItems => Grid.SelectedItems.Cast<object?>();
+    public IEnumerable<object?> SelectedItems
+    {
+        get => SelectionMode == AvaloniaDataGridSelectionMode.Multiple ? _selectedItems : Grid.SelectedItems.Cast<object?>();
+        set
+        {
+            if(SelectionMode == AvaloniaDataGridSelectionMode.Multiple)
+            {
+                _selectedItems.Clear();
+                if (value is not null)
+                {
+                    foreach(var item in value)
+                    {
+                        _selectedItems.Add(item);
+                    }
+                }
+                if(Grid.CollectionView is not null)
+                {
+                    foreach(var item in _selectedItems)
+                    {
+                        if (!Grid.SelectedItems.Contains(item) && Grid.CollectionView.Contains(item))
+                        {
+                            Grid.SelectedItems.Add(item);
+                        }
+                    }
+                }
+            }
+            else
+            {
+                Grid.SelectedItem = value?.FirstOrDefault();
+            }
+        }
+    }
 
     public event EventHandler<AvaloniaDataGridSelectionChangedEventArgs>? SelectionChanged;
     public event EventHandler<AvaloniaDataGridRefreshRequestedEventArgs>? RefreshRequested;
@@ -192,6 +227,17 @@ public partial class AvaloniaDataGrid : UserControl, INotifyPropertyChanged
     {
         ItemCount = (Grid.CollectionView as DataGridCollectionView)?.ItemCount ?? 0;
         UpdateSummaryRow();
+
+        if(SelectionMode == AvaloniaDataGridSelectionMode.Multiple && Grid.CollectionView is not null)
+        {
+            foreach(var item in _selectedItems)
+            {
+                if (!Grid.SelectedItems.Contains(item) && Grid.CollectionView.Contains(item))
+                {
+                    Grid.SelectedItems.Add(item);
+                }
+            }
+        }
     }
 
     private void Columns_Changed(AvaloniaDataGridColumns columns)
@@ -284,9 +330,9 @@ public partial class AvaloniaDataGrid : UserControl, INotifyPropertyChanged
                 Grid.SelectedItems.Remove(item);
             }
         }
-        foreach(var item in e.RemovedItems)
+        foreach(var item in _selectedItems)
         {
-            if (_selectedItems.Contains(item))
+            if (!Grid.SelectedItems.Contains(item) && Grid.CollectionView.Contains(item))
             {
                 Grid.SelectedItems.Add(item);
             }