|
|
@@ -1,6 +1,7 @@
|
|
|
// Copyright (c) The Avalonia Project. All rights reserved.
|
|
|
// Licensed under the MIT license. See licence.md file in the project root for full license information.
|
|
|
|
|
|
+using System.Collections;
|
|
|
using System.Collections.Generic;
|
|
|
using System.Collections.ObjectModel;
|
|
|
using System.Collections.Specialized;
|
|
|
@@ -14,6 +15,7 @@ using Avalonia.Data;
|
|
|
using Avalonia.Input;
|
|
|
using Avalonia.Interactivity;
|
|
|
using Avalonia.Markup.Data;
|
|
|
+using Avalonia.Styling;
|
|
|
using Avalonia.UnitTests;
|
|
|
using Moq;
|
|
|
using Xunit;
|
|
|
@@ -980,6 +982,45 @@ namespace Avalonia.Controls.UnitTests.Primitives
|
|
|
Assert.True(raised);
|
|
|
}
|
|
|
|
|
|
+ [Fact]
|
|
|
+ public void AutoScrollToSelectedItem_On_Reset_Works()
|
|
|
+ {
|
|
|
+ // Issue #3148
|
|
|
+ using (UnitTestApplication.Start(TestServices.StyledWindow))
|
|
|
+ {
|
|
|
+ var items = new ResettingCollection(100);
|
|
|
+
|
|
|
+ var target = new ListBox
|
|
|
+ {
|
|
|
+ Items = items,
|
|
|
+ ItemTemplate = new FuncDataTemplate<string>((x, _) =>
|
|
|
+ new TextBlock
|
|
|
+ {
|
|
|
+ Text = x,
|
|
|
+ Width = 100,
|
|
|
+ Height = 10
|
|
|
+ }),
|
|
|
+ AutoScrollToSelectedItem = true,
|
|
|
+ VirtualizationMode = ItemVirtualizationMode.Simple,
|
|
|
+ };
|
|
|
+
|
|
|
+ var root = new TestRoot(true, target);
|
|
|
+ root.Measure(new Size(100, 100));
|
|
|
+ root.Arrange(new Rect(0, 0, 100, 100));
|
|
|
+
|
|
|
+ Assert.True(target.Presenter.Panel.Children.Count > 0);
|
|
|
+ Assert.True(target.Presenter.Panel.Children.Count < 100);
|
|
|
+
|
|
|
+ target.SelectedItem = "Item99";
|
|
|
+
|
|
|
+ // #3148 triggered here.
|
|
|
+ items.Reset(new[] { "Item99" });
|
|
|
+
|
|
|
+ Assert.Equal(0, target.SelectedIndex);
|
|
|
+ Assert.Equal(1, target.Presenter.Panel.Children.Count);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
[Fact]
|
|
|
public void Can_Set_Both_SelectedItem_And_SelectedItems_During_Initialization()
|
|
|
{
|
|
|
@@ -1028,6 +1069,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
|
|
|
Name = "itemsPresenter",
|
|
|
[~ItemsPresenter.ItemsProperty] = control[~ItemsControl.ItemsProperty],
|
|
|
[~ItemsPresenter.ItemsPanelProperty] = control[~ItemsControl.ItemsPanelProperty],
|
|
|
+ [~ItemsPresenter.VirtualizationModeProperty] = control[~ListBox.VirtualizationModeProperty],
|
|
|
}.RegisterInNameScope(scope));
|
|
|
}
|
|
|
|
|
|
@@ -1072,5 +1114,24 @@ namespace Avalonia.Controls.UnitTests.Primitives
|
|
|
return base.MoveSelection(direction, wrap);
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ private class ResettingCollection : List<string>, INotifyCollectionChanged
|
|
|
+ {
|
|
|
+ public ResettingCollection(int itemCount)
|
|
|
+ {
|
|
|
+ AddRange(Enumerable.Range(0, itemCount).Select(x => $"Item{x}"));
|
|
|
+ }
|
|
|
+
|
|
|
+ public void Reset(IEnumerable<string> items)
|
|
|
+ {
|
|
|
+ Clear();
|
|
|
+ AddRange(items);
|
|
|
+ CollectionChanged?.Invoke(
|
|
|
+ this,
|
|
|
+ new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
|
|
|
+ }
|
|
|
+
|
|
|
+ public event NotifyCollectionChangedEventHandler CollectionChanged;
|
|
|
+ }
|
|
|
}
|
|
|
}
|