From f06fa9881948fc1ea5a87e2ebb28ee6605d95d72 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 6 Jun 2018 00:49:38 +0100 Subject: [PATCH 1/2] fix exception when carousel items set to null. --- src/Avalonia.Controls/Presenters/CarouselPresenter.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Avalonia.Controls/Presenters/CarouselPresenter.cs b/src/Avalonia.Controls/Presenters/CarouselPresenter.cs index 144174e371..35deea05ec 100644 --- a/src/Avalonia.Controls/Presenters/CarouselPresenter.cs +++ b/src/Avalonia.Controls/Presenters/CarouselPresenter.cs @@ -125,8 +125,8 @@ namespace Avalonia.Controls.Presenters var containers = generator.Containers.ToList(); generator.Clear(); Panel.Children.RemoveAll(containers.Select(x => x.ContainerControl)); - - MoveToPage(-1, SelectedIndex >= 0 ? SelectedIndex : 0); + + MoveToPage(-1, SelectedIndex >= 0 ? SelectedIndex : e.NewStartingIndex); } break; } From 9911fff84de01873a61da067dd389d71701fe510 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Thu, 7 Jun 2018 15:11:09 +0100 Subject: [PATCH 2/2] fix carousel presenter and add unit test for condition. --- .../Presenters/CarouselPresenter.cs | 16 ++++++++- .../CarouselTests.cs | 35 +++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/src/Avalonia.Controls/Presenters/CarouselPresenter.cs b/src/Avalonia.Controls/Presenters/CarouselPresenter.cs index 35deea05ec..e438843078 100644 --- a/src/Avalonia.Controls/Presenters/CarouselPresenter.cs +++ b/src/Avalonia.Controls/Presenters/CarouselPresenter.cs @@ -125,8 +125,22 @@ namespace Avalonia.Controls.Presenters var containers = generator.Containers.ToList(); generator.Clear(); Panel.Children.RemoveAll(containers.Select(x => x.ContainerControl)); + + var newIndex = SelectedIndex; + + if(SelectedIndex < 0) + { + if(Items != null && Items.Count() > 0) + { + newIndex = 0; + } + else + { + newIndex = -1; + } + } - MoveToPage(-1, SelectedIndex >= 0 ? SelectedIndex : e.NewStartingIndex); + MoveToPage(-1, newIndex); } break; } diff --git a/tests/Avalonia.Controls.UnitTests/CarouselTests.cs b/tests/Avalonia.Controls.UnitTests/CarouselTests.cs index df61698209..f36e5864f6 100644 --- a/tests/Avalonia.Controls.UnitTests/CarouselTests.cs +++ b/tests/Avalonia.Controls.UnitTests/CarouselTests.cs @@ -170,6 +170,41 @@ namespace Avalonia.Controls.UnitTests Assert.Equal("Bar", ((TextBlock)child).Text); } + [Fact] + public void Selected_Index_Changes_To_When_Items_Assigned_Null() + { + var items = new ObservableCollection + { + "Foo", + "Bar", + "FooBar" + }; + + var target = new Carousel + { + Template = new FuncControlTemplate(CreateTemplate), + Items = items, + IsVirtualized = false + }; + + target.ApplyTemplate(); + target.Presenter.ApplyTemplate(); + + Assert.Single(target.GetLogicalChildren()); + + var child = target.GetLogicalChildren().Single(); + + Assert.IsType(child); + Assert.Equal("Foo", ((TextBlock)child).Text); + + target.Items = null; + + var numChildren = target.GetLogicalChildren().Count(); + + Assert.Equal(0, numChildren); + Assert.Equal(-1, target.SelectedIndex); + } + [Fact] public void Selected_Index_Is_Maintained_Carousel_Created_With_Non_Zero_SelectedIndex() {