From 508883aa4c534f803215b396d621d52b37ca10a5 Mon Sep 17 00:00:00 2001 From: John Boyer Date: Sun, 9 Oct 2022 22:03:05 +1100 Subject: [PATCH 1/2] Addresses #8970, Fixes DataGrid not processing all new items when collection has changed. --- .../Collections/DataGridCollectionView.cs | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/Avalonia.Controls.DataGrid/Collections/DataGridCollectionView.cs b/src/Avalonia.Controls.DataGrid/Collections/DataGridCollectionView.cs index 906ec661ae..41d7883047 100644 --- a/src/Avalonia.Controls.DataGrid/Collections/DataGridCollectionView.cs +++ b/src/Avalonia.Controls.DataGrid/Collections/DataGridCollectionView.cs @@ -3412,8 +3412,7 @@ namespace Avalonia.Collections RefreshOrDefer(); return; } - - object addedItem = args.NewItems?[0]; + object removedItem = args.OldItems?[0]; // fire notifications for removes @@ -3424,11 +3423,17 @@ namespace Avalonia.Collections } // fire notifications for adds - if ((args.Action == NotifyCollectionChangedAction.Add || - args.Action == NotifyCollectionChangedAction.Replace) && - (Filter == null || PassesFilter(addedItem))) + if (args.NewItems != null && + (args.Action == NotifyCollectionChangedAction.Add || + args.Action == NotifyCollectionChangedAction.Replace)) { - ProcessAddEvent(addedItem, args.NewStartingIndex); + for (var i = 0; i < args.NewItems.Count; i++) + { + if (Filter == null || PassesFilter(args.NewItems[i])) + { + ProcessAddEvent(args.NewItems[i], args.NewStartingIndex + i); + } + } } if (args.Action != NotifyCollectionChangedAction.Replace) { From 1a9ed2052aaeea6386a12523239d7d22aeb6dae3 Mon Sep 17 00:00:00 2001 From: John Boyer Date: Mon, 10 Oct 2022 18:04:54 +1100 Subject: [PATCH 2/2] Fixed DataGrid not properly removing multiple items on collection changed. --- .../Collections/DataGridCollectionView.cs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/Avalonia.Controls.DataGrid/Collections/DataGridCollectionView.cs b/src/Avalonia.Controls.DataGrid/Collections/DataGridCollectionView.cs index 41d7883047..30517f4b00 100644 --- a/src/Avalonia.Controls.DataGrid/Collections/DataGridCollectionView.cs +++ b/src/Avalonia.Controls.DataGrid/Collections/DataGridCollectionView.cs @@ -3413,13 +3413,15 @@ namespace Avalonia.Collections return; } - object removedItem = args.OldItems?[0]; - // fire notifications for removes - if (args.Action == NotifyCollectionChangedAction.Remove || - args.Action == NotifyCollectionChangedAction.Replace) + if (args.OldItems != null && + (args.Action == NotifyCollectionChangedAction.Remove || + args.Action == NotifyCollectionChangedAction.Replace)) { - ProcessRemoveEvent(removedItem, args.Action == NotifyCollectionChangedAction.Replace); + foreach (var removedItem in args.OldItems) + { + ProcessRemoveEvent(removedItem, args.Action == NotifyCollectionChangedAction.Replace); + } } // fire notifications for adds