Skip to content

Commit

Permalink
Handle removing focused item.
Browse files Browse the repository at this point in the history
Handle the focused item being removed while it's scrolled outside the viewport.
  • Loading branch information
grokys committed Sep 3, 2024
1 parent 018718d commit e7f8943
Showing 1 changed file with 16 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -663,6 +663,13 @@ private void RecycleElement(Control element, int index)

private void RecycleElementOnItemRemoved(Control element)
{
if (element == _focusedElement)
{
_focusedElement.LostFocus -= OnUnrealizedFocusedElementLostFocus;
_focusedElement = null;
_focusedIndex = -1;
}

UnrealizeElementOnItemRemoved(element);
element.IsVisible = false;
ElementFactory!.RecycleElement(element);
Expand Down Expand Up @@ -691,6 +698,12 @@ private void TrimUnrealizedChildren()

private void OnItemsCollectionChanged(object? sender, NotifyCollectionChangedEventArgs e)
{
void ClearFocusedElement(int index, int count)
{
if (_focusedElement is not null && _focusedIndex >= index && _focusedIndex < index + count)
RecycleElementOnItemRemoved(_focusedElement);
}

InvalidateMeasure();

if (_realizedElements is null)
Expand All @@ -703,13 +716,16 @@ private void OnItemsCollectionChanged(object? sender, NotifyCollectionChangedEve
break;
case NotifyCollectionChangedAction.Remove:
_realizedElements.ItemsRemoved(e.OldStartingIndex, e.OldItems!.Count, _updateElementIndex, _recycleElementOnItemRemoved);
ClearFocusedElement(e.OldStartingIndex, e.OldItems!.Count);
break;
case NotifyCollectionChangedAction.Replace:
_realizedElements.ItemsReplaced(e.OldStartingIndex, e.OldItems!.Count, _recycleElementOnItemRemoved);
ClearFocusedElement(e.OldStartingIndex, e.OldItems!.Count);
break;
case NotifyCollectionChangedAction.Move:
_realizedElements.ItemsRemoved(e.OldStartingIndex, e.OldItems!.Count, _updateElementIndex, _recycleElementOnItemRemoved);
_realizedElements.ItemsInserted(e.NewStartingIndex, e.NewItems!.Count, _updateElementIndex);
ClearFocusedElement(e.OldStartingIndex, e.OldItems!.Count);
break;
case NotifyCollectionChangedAction.Reset:
_realizedElements.ItemsReset(_recycleElementOnItemRemoved);
Expand Down

0 comments on commit e7f8943

Please sign in to comment.