Browse Source

Fix initial selection for AlwaysSelected (#14668)

pull/14470/head
Benedikt Stebner 2 years ago
committed by GitHub
parent
commit
9cb21ee690
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 13
      src/Avalonia.Controls/Primitives/SelectingItemsControl.cs
  2. 30
      tests/Avalonia.Controls.UnitTests/TabControlTests.cs

13
src/Avalonia.Controls/Primitives/SelectingItemsControl.cs

@ -447,6 +447,12 @@ namespace Avalonia.Controls.Primitives
{
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 @@ namespace Avalonia.Controls.Primitives
_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 @@ namespace Avalonia.Controls.Primitives
{
SelectedItem = state.SelectedItem.Value;
}
if (AlwaysSelected && SelectedIndex == -1 && ItemCount > 0)
{
SelectedIndex = 0;
}
}
}

30
tests/Avalonia.Controls.UnitTests/TabControlTests.cs

@ -2,11 +2,13 @@ using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Runtime.CompilerServices;
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;
@ -18,6 +20,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()
{
@ -435,6 +442,29 @@ namespace Avalonia.Controls.UnitTests
}
}
[Fact]
public void Should_Have_Initial_SelectedValue()
{
var xaml = @"
<TabControl
xmlns='https://github.com/avaloniaui'
xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
xmlns:local='clr-namespace:Avalonia.Markup.Xaml.UnitTests.Xaml;assembly=Avalonia.Markup.Xaml.UnitTests'
x:DataType='TabItem'
x:Name='tabs'
Tag='World'
SelectedValue='{Binding $self.Tag}'
SelectedValueBinding='{Binding Header}'>
<TabItem Header='Hello'/>
<TabItem Header='World'/>
</TabControl>";
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()
{

Loading…
Cancel
Save