From 2a78b5e9c25ecd13d49fe1e2e12cd09ceebaf3a4 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Fri, 1 Jun 2018 13:03:16 +0100 Subject: [PATCH] Add unit test and Fix for case where TemplateApplied when SelectedIndex is already set. --- .../Presenters/CarouselPresenter.cs | 2 +- .../CarouselTests.cs | 49 ++++++++++++++++++- 2 files changed, 48 insertions(+), 3 deletions(-) diff --git a/src/Avalonia.Controls/Presenters/CarouselPresenter.cs b/src/Avalonia.Controls/Presenters/CarouselPresenter.cs index 04aa4a1640..28182fd8aa 100644 --- a/src/Avalonia.Controls/Presenters/CarouselPresenter.cs +++ b/src/Avalonia.Controls/Presenters/CarouselPresenter.cs @@ -127,7 +127,7 @@ namespace Avalonia.Controls.Presenters generator.Clear(); Panel.Children.RemoveAll(containers.Select(x => x.ContainerControl)); - MoveToPage(-1, 0); + MoveToPage(-1, SelectedIndex >= 0 ? SelectedIndex : 0); } break; } diff --git a/tests/Avalonia.Controls.UnitTests/CarouselTests.cs b/tests/Avalonia.Controls.UnitTests/CarouselTests.cs index c80e1edb43..c5f1d64e6a 100644 --- a/tests/Avalonia.Controls.UnitTests/CarouselTests.cs +++ b/tests/Avalonia.Controls.UnitTests/CarouselTests.cs @@ -7,6 +7,7 @@ using Avalonia.Controls.Presenters; using Avalonia.Controls.Primitives; using Avalonia.Controls.Templates; using Avalonia.LogicalTree; +using Avalonia.VisualTree; using Xunit; namespace Avalonia.Controls.UnitTests @@ -51,7 +52,7 @@ namespace Avalonia.Controls.UnitTests Assert.Single(target.GetLogicalChildren()); var child = target.GetLogicalChildren().Single(); - + Assert.IsType(child); Assert.Equal("Foo", ((TextBlock)child).Text); } @@ -107,7 +108,7 @@ namespace Avalonia.Controls.UnitTests var target = new Carousel { Template = new FuncControlTemplate(CreateTemplate), - Items = items, + Items = items, IsVirtualized = false }; @@ -132,6 +133,50 @@ namespace Avalonia.Controls.UnitTests Assert.Equal("Bar", ((TextBlock)child).Text); } + [Fact] + public void Selected_Index_Is_Maintained_Carousel_Created_With_Non_Zero_SelectedIndex() + { + var items = new ObservableCollection + { + "Foo", + "Bar", + "FooBar" + }; + + var target = new Carousel + { + Template = new FuncControlTemplate(CreateTemplate), + Items = items, + IsVirtualized = false, + SelectedIndex = 2 + }; + + target.ApplyTemplate(); + target.Presenter.ApplyTemplate(); + + Assert.Equal("FooBar", target.SelectedItem); + + IVisual child = target; + + while (true) + { + if (child.VisualChildren.FirstOrDefault() is TextBlock) + { + break; + } + + if (child.VisualChildren.Count == 0) + { + break; + + } + child = child.VisualChildren.FirstOrDefault().VisualChildren.FirstOrDefault(); + } + + Assert.IsType(child); + Assert.Equal("FooBar", ((TextBlock)child).Text); + } + [Fact] public void Selected_Item_Changes_To_Next_First_Item_When_Item_Removed_From_Beggining_Of_List() {