Skip to content

Commit f725e11

Browse files
committed
Port #4344
1 parent 9779284 commit f725e11

File tree

1 file changed

+34
-15
lines changed

1 file changed

+34
-15
lines changed

src/Core/Components/DataGrid/Columns/SelectColumn.cs

Lines changed: 34 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,15 @@ public DataGridSelectMode SelectMode
221221
[Parameter]
222222
public override IGridSort<TGridItem>? SortBy { get; set; } = null;
223223

224+
/// <summary>
225+
/// Gets or sets the equality comparer used to determine whether two grid items are equal.
226+
/// </summary>
227+
/// <remarks>If not set, the default equality comparer for <typeparamref name="TGridItem"/> is used.
228+
/// Setting this property allows customization of how grid items are compared for equality, which can affect
229+
/// operations such as selection, filtering, or updating items in the grid.</remarks>
230+
[Parameter]
231+
public IEqualityComparer<TGridItem>? Comparer { get; set; } = null;
232+
224233
/// <summary>
225234
/// Allows to clear the selection.
226235
/// </summary>
@@ -310,14 +319,23 @@ private async Task AddOrRemoveSelectedItemAsync(TGridItem? item)
310319
{
311320
if (item != null && (Selectable == null || Selectable.Invoke(item)))
312321
{
313-
if (SelectMode is DataGridSelectMode.SingleSticky && _selectedItems.Contains(item))
322+
if (_selectedItems.Contains(item, Comparer))
314323
{
315-
return;
316-
}
324+
if (SelectMode is DataGridSelectMode.SingleSticky)
325+
{
326+
return;
327+
}
328+
329+
if (Comparer != null)
330+
{
331+
var toRemove = _selectedItems.First(i => Comparer.Equals(i, item));
332+
_selectedItems.Remove(toRemove);
333+
}
334+
else
335+
{
336+
_selectedItems.Remove(item);
337+
}
317338

318-
if (SelectedItems.Contains(item))
319-
{
320-
_selectedItems.Remove(item);
321339
SelectAll = false;
322340
await CallOnSelectAsync(item, isSelected: false);
323341
}
@@ -356,12 +374,12 @@ Task CallOnSelectAsync(TGridItem item, bool isSelected)
356374
private async Task UpdateSelectedItemsAsync()
357375
{
358376

359-
if (!SelectedItems.Any() || InternalGridContext == null || InternalGridContext.Items == null)
377+
if (_selectedItems.Count == 0 || InternalGridContext == null || InternalGridContext.Items == null)
360378
{
361379
return;
362380
}
363381

364-
var itemsToRemove = _selectedItems.Where(item => !InternalGridContext.Items.Contains(item)).ToList();
382+
var itemsToRemove = _selectedItems.Where(item => !InternalGridContext.Items.Contains(item, Comparer)).ToList();
365383
foreach (var item in itemsToRemove)
366384
{
367385
await AddOrRemoveSelectedItemAsync(item);
@@ -427,15 +445,16 @@ private RenderFragment<TGridItem> GetDefaultChildContent()
427445
return;
428446
}
429447

430-
var selected = _selectedItems.Contains(item) || Property.Invoke(item);
448+
var contained = _selectedItems.Contains(item, Comparer);
449+
var selected = contained || Property.Invoke(item);
431450

432451
// Sync with SelectedItems list
433-
if (selected && !_selectedItems.Contains(item))
452+
if (selected && !contained)
434453
{
435454
_selectedItems.Add(item);
436455
RefreshHeaderContent();
437456
}
438-
else if (!selected && _selectedItems.Contains(item))
457+
else if (!selected && contained)
439458
{
440459
_selectedItems.Remove(item);
441460
}
@@ -524,12 +543,12 @@ private void RefreshHeaderContent()
524543
// Using SelectedItems only
525544
if (InternalGridContext != null && (Grid.Items != null || Grid.ItemsProvider != null))
526545
{
527-
if (!SelectedItems.Any())
546+
if (_selectedItems.Count == 0)
528547
{
529548
return false;
530549
}
531550

532-
if (SelectedItems.Take(InternalGridContext.TotalItemCount + 1).Count() == InternalGridContext.TotalItemCount || SelectAll == true)
551+
if (_selectedItems.Count == InternalGridContext.TotalItemCount || SelectAll == true)
533552
{
534553
return true;
535554
}
@@ -570,13 +589,13 @@ internal async Task OnClickAllAsync(MouseEventArgs e)
570589
await SelectAllChanged.InvokeAsync(SelectAll);
571590
}
572591

573-
var count = SelectedItems.Count();
592+
var count = _selectedItems.Count;
574593
// SelectedItems
575594
_selectedItems.Clear();
576595
if (SelectAll == true && count != InternalGridContext.TotalItemCount)
577596
{
578597
// Only add selectable items
579-
_selectedItems.AddRange((InternalGridContext.Grid.Items?.ToList() ?? InternalGridContext.Items)
598+
_selectedItems.AddRange(InternalGridContext.Items
580599
.Where(item => Selectable?.Invoke(item) ?? true)
581600
);
582601
}

0 commit comments

Comments
 (0)