ソースを参照

avalonia: Fixed multi-selection on mobile

Kenric Nugteren 2 ヶ月 前
コミット
ec2b044b54

+ 40 - 7
InABox.Avalonia/Components/AvaloniaDataGrid/AvaloniaDataGrid.axaml.cs

@@ -1,3 +1,4 @@
+using AutoProperties;
 using Avalonia;
 using Avalonia.Collections;
 using Avalonia.Controls;
@@ -246,6 +247,8 @@ public partial class AvaloniaDataGrid : UserControl, INotifyPropertyChanged
         Grid.CollectionView.Refresh();
     }
 
+    private HashSet<object?> _selectedItems = new();
+
     private void DataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
     {
         if(SelectionMode == AvaloniaDataGridSelectionMode.None && Grid.SelectedItems.Count > 0)
@@ -257,19 +260,34 @@ public partial class AvaloniaDataGrid : UserControl, INotifyPropertyChanged
 
         if (SelectionMode != AvaloniaDataGridSelectionMode.Multiple) return;
 
+        foreach(var item in e.AddedItems)
+        {
+            if (!_selectedItems.Contains(item))
+            {
+                Grid.SelectedItems.Remove(item);
+            }
+        }
+        foreach(var item in e.RemovedItems)
+        {
+            if (_selectedItems.Contains(item))
+            {
+                Grid.SelectedItems.Add(item);
+            }
+        }
+        // Grid.SelectedItems.Add(ItemsSource.Cast<object>().First());
+        // Grid.SelectedItems.Clear();
+
         SelectionChanged?.Invoke(this, new AvaloniaDataGridSelectionChangedEventArgs(SelectedItems.ToArray()));
     }
 
     private void DataGrid_Tapped(object sender, TappedEventArgs e)
     {
-        if (SelectionMode == AvaloniaDataGridSelectionMode.Multiple) return;
-
         var position = e.GetPosition(Grid);
 
         var parent = (e.Source as Visual)?.GetVisualAncestors().Where(x => x is DataGridCell || x is DataGridColumnHeader).FirstOrDefault();
         if (parent is null) return;
 
-        if(parent is DataGridCell cell)
+        if (parent is DataGridCell cell)
         {
             var cellCollection = cell.GetVisualParent<DataGridCellsPresenter>();
             if (cellCollection is null) return;
@@ -286,14 +304,29 @@ public partial class AvaloniaDataGrid : UserControl, INotifyPropertyChanged
 
             var item = (Grid.CollectionView as DataGridCollectionView)?.GetItemAt(rowIdx);
 
-            var column = Columns[colIdx];
-            if(column.Tapped is not null)
+            if (SelectionMode == AvaloniaDataGridSelectionMode.Multiple)
             {
-                column.Tapped?.Invoke(column, item);
+                if (_selectedItems.Remove(item))
+                {
+                    Grid.SelectedItems.Remove(item);
+                }
+                else
+                {
+                    _selectedItems.Add(item);
+                    Grid.SelectedItems.Add(item);
+                }
             }
             else
             {
-                SelectionChanged?.Invoke(this, new AvaloniaDataGridSelectionChangedEventArgs(new object?[] { item }));
+                var column = Columns[colIdx];
+                if (column.Tapped is not null)
+                {
+                    column.Tapped?.Invoke(column, item);
+                }
+                else
+                {
+                    SelectionChanged?.Invoke(this, new AvaloniaDataGridSelectionChangedEventArgs(new object?[] { item }));
+                }
             }
         }
         else if(parent is DataGridColumnHeader header)