|
|
@@ -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)
|