diff --git a/src/Perspex.Controls/Primitives/SelectingItemsControl.cs b/src/Perspex.Controls/Primitives/SelectingItemsControl.cs
index ad95c38206..9abd72635d 100644
--- a/src/Perspex.Controls/Primitives/SelectingItemsControl.cs
+++ b/src/Perspex.Controls/Primitives/SelectingItemsControl.cs
@@ -265,7 +265,7 @@ namespace Perspex.Controls.Primitives
}
///
- /// Updates the selection for an item.
+ /// Updates the selection for an item based on user interaction.
///
/// The index of the item.
/// Whether the item should be selected or unselected.
@@ -275,7 +275,9 @@ namespace Perspex.Controls.Primitives
{
if (select)
{
- var toggle = (SelectionMode & SelectionMode.Toggle) != 0;
+ var mode = SelectionMode;
+ var toggle = (mode & SelectionMode.Toggle) != 0;
+ var multi = (mode & SelectionMode.Multiple) != 0;
if (!toggle)
{
@@ -291,7 +293,14 @@ namespace Perspex.Controls.Primitives
}
else
{
- SelectedIndexes.Add(index);
+ if (multi)
+ {
+ SelectedIndexes.Add(index);
+ }
+ else
+ {
+ SelectedIndex = index;
+ }
}
}
}
@@ -303,7 +312,7 @@ namespace Perspex.Controls.Primitives
}
///
- /// Updates the selection for a container.
+ /// Updates the selection for a container based on user interaction.
///
/// The container.
/// Whether the container should be selected or unselected.
diff --git a/tests/Perspex.Controls.UnitTests/ListBoxTests_Single.cs b/tests/Perspex.Controls.UnitTests/ListBoxTests_Single.cs
index 968c2a7b03..8dba79c008 100644
--- a/tests/Perspex.Controls.UnitTests/ListBoxTests_Single.cs
+++ b/tests/Perspex.Controls.UnitTests/ListBoxTests_Single.cs
@@ -122,7 +122,7 @@ namespace Perspex.Controls.UnitTests
{
Template = new ControlTemplate(CreateListBoxTemplate),
Items = new[] { "Foo", "Bar", "Baz " },
- SelectionMode = SelectionMode.Single | SelectionMode.Toggle,
+ SelectionMode = SelectionMode.Toggle,
};
target.ApplyTemplate();
@@ -137,6 +137,50 @@ namespace Perspex.Controls.UnitTests
Assert.Equal(-1, target.SelectedIndex);
}
+ [Fact]
+ public void Clicking_Selected_Item_Should_Not_Deselect_It_When_SelectionMode_ToggleAlwaysSelected()
+ {
+ var target = new ListBox
+ {
+ Template = new ControlTemplate(CreateListBoxTemplate),
+ Items = new[] { "Foo", "Bar", "Baz " },
+ SelectionMode = SelectionMode.Toggle | SelectionMode.AlwaysSelected,
+ };
+
+ target.ApplyTemplate();
+ target.SelectedIndex = 0;
+
+ target.Presenter.Panel.Children[0].RaiseEvent(new PointerPressEventArgs
+ {
+ RoutedEvent = InputElement.PointerPressedEvent,
+ MouseButton = MouseButton.Left,
+ });
+
+ Assert.Equal(0, target.SelectedIndex);
+ }
+
+ [Fact]
+ public void Clicking_Another_Item_Should_Select_It_When_SelectionMode_Toggle()
+ {
+ var target = new ListBox
+ {
+ Template = new ControlTemplate(CreateListBoxTemplate),
+ Items = new[] { "Foo", "Bar", "Baz " },
+ SelectionMode = SelectionMode.Single | SelectionMode.Toggle,
+ };
+
+ target.ApplyTemplate();
+ target.SelectedIndex = 1;
+
+ target.Presenter.Panel.Children[0].RaiseEvent(new PointerPressEventArgs
+ {
+ RoutedEvent = InputElement.PointerPressedEvent,
+ MouseButton = MouseButton.Left,
+ });
+
+ Assert.Equal(0, target.SelectedIndex);
+ }
+
[Fact]
public void Setting_Item_IsSelected_Sets_ListBox_Selection()
{