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