Browse Source

Fixed problem in toggle mode with single selection.

Steven Kirk 10 years ago
parent
commit
49e2e3ec86

+ 13 - 4
src/Perspex.Controls/Primitives/SelectingItemsControl.cs

@@ -265,7 +265,7 @@ namespace Perspex.Controls.Primitives
         }
 
         /// <summary>
-        /// Updates the selection for an item.
+        /// Updates the selection for an item based on user interaction.
         /// </summary>
         /// <param name="index">The index of the item.</param>
         /// <param name="select">Whether the item should be selected or unselected.</param>
@@ -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
         }
 
         /// <summary>
-        /// Updates the selection for a container.
+        /// Updates the selection for a container based on user interaction.
         /// </summary>
         /// <param name="container">The container.</param>
         /// <param name="select">Whether the container should be selected or unselected.</param>

+ 45 - 1
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()
         {