From 82992f86970ef617457393f2f26a044be5383c5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mi=C5=82osz=20Kukla?= Date: Mon, 23 Sep 2019 02:24:57 +0200 Subject: [PATCH 1/5] Rename ResourceProviderExtensions to ResourceNodeExtensions --- ...{ResourceProviderExtensions.cs => ResourceNodeExtensions.cs} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/Avalonia.Styling/Controls/{ResourceProviderExtensions.cs => ResourceNodeExtensions.cs} (98%) diff --git a/src/Avalonia.Styling/Controls/ResourceProviderExtensions.cs b/src/Avalonia.Styling/Controls/ResourceNodeExtensions.cs similarity index 98% rename from src/Avalonia.Styling/Controls/ResourceProviderExtensions.cs rename to src/Avalonia.Styling/Controls/ResourceNodeExtensions.cs index 01112eaf2c..19a16f86c4 100644 --- a/src/Avalonia.Styling/Controls/ResourceProviderExtensions.cs +++ b/src/Avalonia.Styling/Controls/ResourceNodeExtensions.cs @@ -3,7 +3,7 @@ using Avalonia.Reactive; namespace Avalonia.Controls { - public static class ResourceProviderExtensions + public static class ResourceNodeExtensions { /// /// Finds the specified resource by searching up the logical tree and then global styles. From 5b15fe4b4114332ed91f8dce9d5867be484d86ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mi=C5=82osz=20Kukla?= Date: Sat, 28 Sep 2019 16:01:17 +0200 Subject: [PATCH 2/5] Allow to use object as a resource key in Static/DynamicResourceExtension --- .../MarkupExtensions/DynamicResourceExtension.cs | 2 +- .../MarkupExtensions/StaticResourceExtension.cs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/DynamicResourceExtension.cs b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/DynamicResourceExtension.cs index 0a9289bec9..5bdb0cc235 100644 --- a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/DynamicResourceExtension.cs +++ b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/DynamicResourceExtension.cs @@ -18,7 +18,7 @@ namespace Avalonia.Markup.Xaml.MarkupExtensions { } - public DynamicResourceExtension(string resourceKey) + public DynamicResourceExtension(object resourceKey) { ResourceKey = resourceKey; } diff --git a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/StaticResourceExtension.cs b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/StaticResourceExtension.cs index d6b170ae9d..6d055e033f 100644 --- a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/StaticResourceExtension.cs +++ b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/StaticResourceExtension.cs @@ -16,12 +16,12 @@ namespace Avalonia.Markup.Xaml.MarkupExtensions { } - public StaticResourceExtension(string resourceKey) + public StaticResourceExtension(object resourceKey) { ResourceKey = resourceKey; } - public string ResourceKey { get; set; } + public object ResourceKey { get; set; } public object ProvideValue(IServiceProvider serviceProvider) { From 9a6cda66bcaa38fe58500320b5e16e71fcca07a2 Mon Sep 17 00:00:00 2001 From: Benedikt Schroeder Date: Sun, 29 Sep 2019 18:54:08 +0200 Subject: [PATCH 3/5] Add failing test for #2987 --- .../Primitives/SelectingItemsControlTests.cs | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/tests/Avalonia.Controls.UnitTests/Primitives/SelectingItemsControlTests.cs b/tests/Avalonia.Controls.UnitTests/Primitives/SelectingItemsControlTests.cs index 4e4d92afdc..8f27ebe853 100644 --- a/tests/Avalonia.Controls.UnitTests/Primitives/SelectingItemsControlTests.cs +++ b/tests/Avalonia.Controls.UnitTests/Primitives/SelectingItemsControlTests.cs @@ -109,6 +109,28 @@ namespace Avalonia.Controls.UnitTests.Primitives Assert.True(items[1].IsSelected); } + [Fact] + public void Setting_SelectedIndex_During_Initialize_Should_Select_Item_When_AlwaysSelected_Is_Used() + { + var listBox = new ListBox + { + SelectionMode = SelectionMode.Single | SelectionMode.AlwaysSelected + }; + + listBox.BeginInit(); + + listBox.SelectedIndex = 1; + var items = new AvaloniaList(); + listBox.Items = items; + items.Add("A"); + items.Add("B"); + items.Add("C"); + + listBox.EndInit(); + + Assert.Equal("B", listBox.SelectedItem); + } + [Fact] public void Setting_SelectedIndex_Before_ApplyTemplate_Should_Set_Item_IsSelected_True() { From bcbe9c3dbd6e2eb824b9947d667096d98edbaca5 Mon Sep 17 00:00:00 2001 From: Benedikt Schroeder Date: Wed, 18 Sep 2019 19:01:48 +0200 Subject: [PATCH 4/5] Fix setting SelectedIndex in XAML --- .../Primitives/SelectingItemsControl.cs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs b/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs index cc0c5f52be..761a3f3b3d 100644 --- a/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs +++ b/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs @@ -304,6 +304,11 @@ namespace Avalonia.Controls.Primitives { base.ItemsCollectionChanged(sender, e); + if (_updateCount > 0) + { + return; + } + switch (e.Action) { case NotifyCollectionChangedAction.Add: @@ -1071,13 +1076,16 @@ namespace Avalonia.Controls.Primitives private void UpdateFinished() { - if (_updateSelectedIndex != int.MinValue) + if (_updateSelectedItem != null) { - SelectedIndex = _updateSelectedIndex; + SelectedItem = _updateSelectedItem; } - else if (_updateSelectedItem != null) + else { - SelectedItem = _updateSelectedItem; + if (ItemCount > 0) + { + SelectedIndex = _updateSelectedIndex != int.MinValue ? _updateSelectedIndex : 0; + } } } From b42126b9e35cc5ce404963584fee95bc7f1b77c3 Mon Sep 17 00:00:00 2001 From: Benedikt Schroeder Date: Wed, 18 Sep 2019 19:22:23 +0200 Subject: [PATCH 5/5] Properly reset SelectedIndex after the DataContext changed --- src/Avalonia.Controls/Primitives/SelectingItemsControl.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs b/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs index 761a3f3b3d..a50175bdee 100644 --- a/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs +++ b/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs @@ -1082,7 +1082,11 @@ namespace Avalonia.Controls.Primitives } else { - if (ItemCount > 0) + if (ItemCount == 0 && SelectedIndex != -1) + { + SelectedIndex = -1; + } + else { SelectedIndex = _updateSelectedIndex != int.MinValue ? _updateSelectedIndex : 0; }