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