Skip to content

Commit 6180d3a

Browse files
authored
[DataGrid] Add a SelectColumn Comparer property (#4344)
* Added a SelectColumn comparer property * Added Comparer property summary on SelectColumn
1 parent e337cf8 commit 6180d3a

File tree

1 file changed

+34
-25
lines changed

1 file changed

+34
-25
lines changed

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

Lines changed: 34 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,15 @@ public DataGridSelectMode SelectMode
209209
[Parameter]
210210
public override IGridSort<TGridItem>? SortBy { get; set; }
211211

212+
/// <summary>
213+
/// Gets or sets the equality comparer used to determine whether two grid items are equal.
214+
/// </summary>
215+
/// <remarks>If not set, the default equality comparer for <typeparamref name="TGridItem"/> is used.
216+
/// Setting this property allows customization of how grid items are compared for equality, which can affect
217+
/// operations such as selection, filtering, or updating items in the grid.</remarks>
218+
[Parameter]
219+
public IEqualityComparer<TGridItem>? Comparer { get; set; } = null;
220+
212221
/// <summary>
213222
/// Allows to clear the selection.
214223
/// </summary>
@@ -296,14 +305,21 @@ private async Task AddOrRemoveSelectedItemAsync(TGridItem? item)
296305
{
297306
if (item != null && (Selectable == null || Selectable.Invoke(item)))
298307
{
299-
if (SelectMode is DataGridSelectMode.SingleSticky && _selectedItems.Contains(item))
308+
if (_selectedItems.Contains(item, Comparer))
300309
{
301-
return;
302-
}
303-
304-
if (SelectedItems.Contains(item))
305-
{
306-
_selectedItems.Remove(item);
310+
if (SelectMode is DataGridSelectMode.SingleSticky)
311+
{
312+
return;
313+
}
314+
if (Comparer != null)
315+
{
316+
var toRemove = _selectedItems.First(i => Comparer.Equals(i, item));
317+
_selectedItems.Remove(toRemove);
318+
}
319+
else
320+
{
321+
_selectedItems.Remove(item);
322+
}
307323
SelectAll = false;
308324
await CallOnSelectAsync(item, false);
309325
}
@@ -340,13 +356,12 @@ Task CallOnSelectAsync(TGridItem item, bool isSelected)
340356

341357
private async Task UpdateSelectedItemsAsync()
342358
{
343-
344-
if (!SelectedItems.Any() || InternalGridContext == null || InternalGridContext.Items == null)
359+
if (_selectedItems.Count == 0 || InternalGridContext == null || InternalGridContext.Items == null)
345360
{
346361
return;
347362
}
348363

349-
var itemsToRemove = _selectedItems.Where(item => !InternalGridContext.Items.Contains(item)).ToList();
364+
var itemsToRemove = _selectedItems.Where(item => !InternalGridContext.Items.Contains(item, Comparer)).ToList();
350365
foreach (var item in itemsToRemove)
351366
{
352367
await AddOrRemoveSelectedItemAsync(item);
@@ -414,15 +429,16 @@ private RenderFragment<TGridItem> GetDefaultChildContent()
414429
return;
415430
}
416431

417-
var selected = _selectedItems.Contains(item) || Property.Invoke(item);
432+
var contained = _selectedItems.Contains(item, Comparer);
433+
var selected = contained || Property.Invoke(item);
418434

419435
// Sync with SelectedItems list
420-
if (selected && !_selectedItems.Contains(item))
436+
if (selected && !contained)
421437
{
422438
_selectedItems.Add(item);
423439
RefreshHeaderContent();
424440
}
425-
else if (!selected && _selectedItems.Contains(item))
441+
else if (!selected && contained)
426442
{
427443
_selectedItems.Remove(item);
428444
}
@@ -508,23 +524,16 @@ private void RefreshHeaderContent()
508524
// Using SelectedItems only
509525
if (InternalGridContext != null && (Grid.Items != null || Grid.ItemsProvider != null))
510526
{
511-
if (!SelectedItems.Any())
527+
if (_selectedItems.Count == 0)
512528
{
513529
return false;
514530
}
515-
else if (SelectedItems.Count() == InternalGridContext.TotalItemCount || SelectAll == true)
531+
else if (_selectedItems.Count == InternalGridContext.TotalItemCount || SelectAll == true)
516532
{
517533
return true;
518534
}
519-
else
520-
{
521-
return null;
522-
}
523-
}
524-
else
525-
{
526-
return null;
527535
}
536+
return null;
528537
}
529538

530539
/// <inheritdoc />
@@ -555,13 +564,13 @@ internal async Task OnClickAllAsync(MouseEventArgs e)
555564
await SelectAllChanged.InvokeAsync(SelectAll);
556565
}
557566

558-
var count = SelectedItems.Count();
559567
// SelectedItems
568+
var count = _selectedItems.Count;
560569
_selectedItems.Clear();
561570
if (SelectAll == true && count != InternalGridContext.TotalItemCount)
562571
{
563572
// Only add selectable items
564-
_selectedItems.AddRange((InternalGridContext.Grid.Items?.ToList() ?? InternalGridContext.Items)
573+
_selectedItems.AddRange(InternalGridContext.Items
565574
.Where(item => Selectable?.Invoke(item) ?? true)
566575
);
567576
}

0 commit comments

Comments
 (0)