Fix for CollectionView with RefreshView when ObservableCollection<T>.Clear() throws System.ArgumentOutOfRangeException #26573
+148
−1
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Root Cause:
The issue arises because the
UICollectionView
's internal_itemSource
becomes empty during pull-to-refresh, even though theItemsSource
in the controller still holds a valid count. This discrepancy causes an invalid state, where theGetSizeForItem
method tries to access an index that no longer exists, resulting in aSystem.ArgumentOutOfRangeException
. The issue was further compounded by the fact thatGetSizeForItem
was being called before theCollectionChanged
event was triggered. This occurs because theContentOffset
is set during the pull-to-refresh operation, which prematurely triggers layout recalculations, leading to an invalid state.Description of Change:
The change ensures the
ElementAt
method safely accesses elements by validating the index with(index >= 0 && index < list.Count)
. Using a ternary operator, it immediately returns the item or-1
for invalid indices, preventingSystem.ArgumentOutOfRangeException
and simplifying the logic for better reliability.Issues Fixed
Fixes #23868
Tested the behaviour in the following platforms
###Output Video
withoutfix.mov
withfix.mov