diff --git a/src/Perspex.Controls/Primitives/SelectingItemsControl.cs b/src/Perspex.Controls/Primitives/SelectingItemsControl.cs
index 629dbd8d6f..e683fc43f9 100644
--- a/src/Perspex.Controls/Primitives/SelectingItemsControl.cs
+++ b/src/Perspex.Controls/Primitives/SelectingItemsControl.cs
@@ -377,6 +377,23 @@ namespace Perspex.Controls.Primitives
}
}
+ ///
+ protected override void OnContainersDematerialized(ItemContainerEventArgs e)
+ {
+ base.OnContainersDematerialized(e);
+
+ var panel = (InputElement)Presenter.Panel;
+
+ foreach (var container in e.Containers)
+ {
+ if (KeyboardNavigation.GetTabOnceActiveElement(panel) == container.ContainerControl)
+ {
+ KeyboardNavigation.SetTabOnceActiveElement(panel, null);
+ break;
+ }
+ }
+ }
+
///
protected override void OnDataContextChanging()
{
diff --git a/tests/Perspex.Controls.UnitTests/ListBoxTests.cs b/tests/Perspex.Controls.UnitTests/ListBoxTests.cs
index a502d3b186..82702adef8 100644
--- a/tests/Perspex.Controls.UnitTests/ListBoxTests.cs
+++ b/tests/Perspex.Controls.UnitTests/ListBoxTests.cs
@@ -104,30 +104,6 @@ namespace Perspex.Controls.UnitTests
dataContexts);
}
- [Fact]
- public void Setting_SelectedItem_Should_Set_Panel_Keyboard_Navigation()
- {
- var target = new ListBox
- {
- Template = new FuncControlTemplate(CreateListBoxTemplate),
- Items = new[] { "Foo", "Bar", "Baz " },
- };
-
- ApplyTemplate(target);
-
- target.Presenter.Panel.Children[1].RaiseEvent(new PointerPressedEventArgs
- {
- RoutedEvent = InputElement.PointerPressedEvent,
- MouseButton = MouseButton.Left,
- });
-
- var panel = target.Presenter.Panel;
-
- Assert.Equal(
- KeyboardNavigation.GetTabOnceActiveElement((InputElement)panel),
- panel.Children[1]);
- }
-
private Control CreateListBoxTemplate(ITemplatedControl parent)
{
return new ScrollViewer
diff --git a/tests/Perspex.Controls.UnitTests/Primitives/SelectingItemsControlTests.cs b/tests/Perspex.Controls.UnitTests/Primitives/SelectingItemsControlTests.cs
index 361d6a5d08..46fba11250 100644
--- a/tests/Perspex.Controls.UnitTests/Primitives/SelectingItemsControlTests.cs
+++ b/tests/Perspex.Controls.UnitTests/Primitives/SelectingItemsControlTests.cs
@@ -8,6 +8,7 @@ using Perspex.Collections;
using Perspex.Controls.Presenters;
using Perspex.Controls.Primitives;
using Perspex.Controls.Templates;
+using Perspex.Input;
using Perspex.Interactivity;
using Perspex.Markup.Xaml.Data;
using Perspex.UnitTests;
@@ -604,6 +605,57 @@ namespace Perspex.Controls.UnitTests.Primitives
Assert.Equal(0, root.SelectedIndex);
}
+ [Fact]
+ public void Setting_SelectedItem_With_Pointer_Should_Set_TabOnceActiveElement()
+ {
+ var target = new ListBox
+ {
+ Template = Template(),
+ Items = new[] { "Foo", "Bar", "Baz " },
+ };
+
+ target.ApplyTemplate();
+ target.Presenter.ApplyTemplate();
+
+ target.Presenter.Panel.Children[1].RaiseEvent(new PointerPressedEventArgs
+ {
+ RoutedEvent = InputElement.PointerPressedEvent,
+ MouseButton = MouseButton.Left,
+ });
+
+ var panel = target.Presenter.Panel;
+
+ Assert.Equal(
+ KeyboardNavigation.GetTabOnceActiveElement((InputElement)panel),
+ panel.Children[1]);
+ }
+
+ [Fact]
+ public void Removing_SelectedItem_Should_Clear_TabOnceActiveElement()
+ {
+ var items = new ObservableCollection(new[] { "Foo", "Bar", "Baz " });
+
+ var target = new ListBox
+ {
+ Template = Template(),
+ Items = items,
+ };
+
+ target.ApplyTemplate();
+ target.Presenter.ApplyTemplate();
+
+ target.Presenter.Panel.Children[1].RaiseEvent(new PointerPressedEventArgs
+ {
+ RoutedEvent = InputElement.PointerPressedEvent,
+ MouseButton = MouseButton.Left,
+ });
+
+ items.RemoveAt(1);
+
+ var panel = target.Presenter.Panel;
+
+ Assert.Null(KeyboardNavigation.GetTabOnceActiveElement((InputElement)panel));
+ }
private FuncControlTemplate Template()
{