diff --git a/src/Avalonia.Controls/Presenters/CarouselPresenter.cs b/src/Avalonia.Controls/Presenters/CarouselPresenter.cs index c6ef5a14e9..64417a0176 100644 --- a/src/Avalonia.Controls/Presenters/CarouselPresenter.cs +++ b/src/Avalonia.Controls/Presenters/CarouselPresenter.cs @@ -106,7 +106,6 @@ namespace Avalonia.Controls.Presenters /// protected override void ItemsChanged(NotifyCollectionChangedEventArgs e) { - // TODO: Handle items changing. switch (e.Action) { case NotifyCollectionChangedAction.Remove: @@ -118,6 +117,35 @@ namespace Avalonia.Controls.Presenters } break; + case NotifyCollectionChangedAction.Reset: + if(!IsVirtualized) + { + var generator = ItemContainerGenerator; + var containers = generator.Containers.ToList(); + generator.Clear(); + Panel.Children.RemoveAll(containers.Select(x => x.ContainerControl)); + } + break; + + case NotifyCollectionChangedAction.Add: + Panel.Children.InsertRange(e.NewStartingIndex, e.NewItems.OfType()); + break; + + case NotifyCollectionChangedAction.Replace: + if (!IsVirtualized) + { + for (var i = 0; i < e.OldItems.Count; ++i) + { + var index = i + e.OldStartingIndex; + var child = (IControl)e.NewItems[i]; + Panel.Children[index] = child; + } + } + break; + + case NotifyCollectionChangedAction.Move: + Panel.Children.MoveRange(e.OldStartingIndex, e.OldItems.Count, e.NewStartingIndex); + break; } }