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() {