Browse Source

Implement SelectedIndex in terms of SelectedIndexes.

Steven Kirk 10 years ago
parent
commit
e93d9d463c
1 changed files with 33 additions and 5 deletions
  1. 33 5
      src/Perspex.Controls/Primitives/SelectingItemsControl.cs

+ 33 - 5
src/Perspex.Controls/Primitives/SelectingItemsControl.cs

@@ -38,6 +38,14 @@ namespace Perspex.Controls.Primitives
                 o => o.SelectedItem,
                 (o, v) => o.SelectedItem = v);
 
+        /// <summary>
+        /// Defines the <see cref="SelectedIndexes"/> property.
+        /// </summary>
+        protected static readonly PerspexProperty<IList<int>> SelectedIndexesProperty =
+            PerspexProperty.RegisterDirect<SelectingItemsControl, IList<int>>(
+                nameof(SelectedIndexes),
+                o => o.SelectedIndexes);
+
         /// <summary>
         /// Defines the <see cref="SelectedItems"/> property.
         /// </summary>
@@ -61,8 +69,8 @@ namespace Perspex.Controls.Primitives
         public static readonly RoutedEvent<RoutedEventArgs> IsSelectedChangedEvent =
             RoutedEvent.Register<SelectingItemsControl, RoutedEventArgs>("IsSelectedChanged", RoutingStrategies.Bubble);
 
-        private int _selectedIndex = -1;
-        private IList<object> _selectedItems = new PerspexList<object>();
+        private PerspexList<int> _selectedIndexes = new PerspexList<int>();
+        private PerspexList<object> _selectedItems = new PerspexList<object>();
 
         /// <summary>
         /// Initializes static members of the <see cref="SelectingItemsControl"/> class.
@@ -89,13 +97,25 @@ namespace Perspex.Controls.Primitives
         {
             get
             {
-                return _selectedIndex;
+                return _selectedIndexes.Count > 0 ? _selectedIndexes[0]: -1;
             }
 
             set
             {
-                value = (value >= 0 && value < Items?.Cast<object>().Count()) ? value : -1;
-                SetAndRaise(SelectedIndexProperty, ref _selectedIndex, value);
+                var old = SelectedIndex;
+                var effective = (value >= 0 && value < Items?.Cast<object>().Count()) ? value : -1;
+
+                if (old != effective)
+                {
+                    _selectedIndexes.Clear();
+
+                    if (effective != -1)
+                    {
+                        _selectedIndexes.Add(effective);
+                    }
+
+                    RaisePropertyChanged(SelectedIndexProperty, old, effective, BindingPriority.LocalValue);
+                }
             }
         }
 
@@ -128,6 +148,14 @@ namespace Perspex.Controls.Primitives
             }
         }
 
+        /// <summary>
+        /// Gets the selected indexes.
+        /// </summary>
+        protected IList<int> SelectedIndexes
+        {
+            get { return _selectedIndexes; }
+        }
+
         /// <summary>
         /// Gets the selected items.
         /// </summary>