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;
}
}