From 998b7a8e9c2087b44f3e605104a44f67f6f27ad3 Mon Sep 17 00:00:00 2001 From: Benedikt Stebner Date: Wed, 21 Feb 2024 00:38:56 +0100 Subject: [PATCH] Fix initial selection for AlwaysSelected (#14668) #Conflicts: # tests/Avalonia.Controls.UnitTests/TabControlTests.cs --- .../Primitives/SelectingItemsControl.cs | 13 +++++++- .../TabControlTests.cs | 30 +++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs b/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs index 185af1a7158..41960ac670d 100644 --- a/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs +++ b/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs @@ -447,6 +447,12 @@ private protected override void OnItemsViewCollectionChanged(object? sender, Not { base.OnItemsViewCollectionChanged(sender!, e); + //Do not change SelectedIndex during initialization + if (_updateState is not null) + { + return; + } + if (AlwaysSelected && SelectedIndex == -1 && ItemCount > 0) { SelectedIndex = 0; @@ -1217,7 +1223,7 @@ private void InitializeSelectionModel(ISelectionModel model) _oldSelectedIndex = model.SelectedIndex; _oldSelectedItem = model.SelectedItem; - if (AlwaysSelected && model.Count == 0) + if (_updateState is null && AlwaysSelected && model.Count == 0) { model.SelectedIndex = 0; } @@ -1297,6 +1303,11 @@ private void EndUpdating() { SelectedItem = state.SelectedItem.Value; } + + if (AlwaysSelected && SelectedIndex == -1 && ItemCount > 0) + { + SelectedIndex = 0; + } } } diff --git a/tests/Avalonia.Controls.UnitTests/TabControlTests.cs b/tests/Avalonia.Controls.UnitTests/TabControlTests.cs index 77210184537..e6858817f11 100644 --- a/tests/Avalonia.Controls.UnitTests/TabControlTests.cs +++ b/tests/Avalonia.Controls.UnitTests/TabControlTests.cs @@ -2,12 +2,14 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; +using System.Runtime.CompilerServices; using Avalonia.Collections; using Avalonia.Controls.Presenters; using Avalonia.Controls.Primitives; using Avalonia.Controls.Selection; using Avalonia.Controls.Templates; using Avalonia.Controls.Utils; +using Avalonia.Data; using Avalonia.Input; using Avalonia.LogicalTree; using Avalonia.Markup.Xaml; @@ -19,6 +21,11 @@ namespace Avalonia.Controls.UnitTests { public class TabControlTests { + static TabControlTests() + { + RuntimeHelpers.RunClassConstructor(typeof(RelativeSource).TypeHandle); + } + [Fact] public void First_Tab_Should_Be_Selected_By_Default() { @@ -436,6 +443,29 @@ public void Can_Have_Empty_Tab_Control() } } + [Fact] + public void Should_Have_Initial_SelectedValue() + { + var xaml = @" + + + + "; + + var tabControl = (TabControl)AvaloniaRuntimeXamlLoader.Load(xaml); + + Assert.Equal("World", tabControl.SelectedValue); + Assert.Equal(1, tabControl.SelectedIndex); + } + [Fact] public void Tab_Navigation_Should_Move_To_First_TabItem_When_No_Anchor_Element_Selected() {