Browse Source

Added ItemSelector property to the AutoCompleteBox

Kir-Antipov 5 years ago
parent
commit
bc87efc65f
1 changed files with 45 additions and 9 deletions
  1. 45 9
      src/Avalonia.Controls/AutoCompleteBox.cs

+ 45 - 9
src/Avalonia.Controls/AutoCompleteBox.cs

@@ -242,7 +242,7 @@ namespace Avalonia.Controls
     /// <typeparam name="T">
     /// The type used for filtering the
     /// <see cref="T:Avalonia.Controls.AutoCompleteBox" />.
-    /// At the moment this type known only as a string.
+    /// This type can be either a string or an object.
     /// </typeparam>
     public delegate string AutoCompleteSelector<T>(string search, T item);
 
@@ -383,6 +383,7 @@ namespace Avalonia.Controls
         private AutoCompleteFilterPredicate<object> _itemFilter;
         private AutoCompleteFilterPredicate<string> _textFilter = AutoCompleteSearch.GetFilter(AutoCompleteFilterMode.StartsWith);
 
+        private AutoCompleteSelector<object> _itemSelector;
         private AutoCompleteSelector<string> _textSelector;
 
         public static readonly RoutedEvent<SelectionChangedEventArgs> SelectionChangedEvent =
@@ -551,6 +552,20 @@ namespace Avalonia.Controls
                 (o, v) => o.TextFilter = v,
                 unsetValue: AutoCompleteSearch.GetFilter(AutoCompleteFilterMode.StartsWith));
 
+        /// <summary>
+        /// Identifies the
+        /// <see cref="P:Avalonia.Controls.AutoCompleteBox.ItemSelector" />
+        /// dependency property.
+        /// </summary>
+        /// <value>The identifier for the
+        /// <see cref="P:Avalonia.Controls.AutoCompleteBox.ItemSelector" />
+        /// dependency property.</value>
+        public static readonly DirectProperty<AutoCompleteBox, AutoCompleteSelector<object>> ItemSelectorProperty =
+            AvaloniaProperty.RegisterDirect<AutoCompleteBox, AutoCompleteSelector<object>>(
+                nameof(ItemSelector),
+                o => o.ItemSelector,
+                (o, v) => o.ItemSelector = v);
+
         /// <summary>
         /// Identifies the
         /// <see cref="P:Avalonia.Controls.AutoCompleteBox.TextSelector" />
@@ -1100,18 +1115,32 @@ namespace Avalonia.Controls
 
         /// <summary>
         /// Gets or sets the custom method that combines the user-entered
-        /// text to and one of the items specified by the
+        /// text and one of the items specified by the
         /// <see cref="P:Avalonia.Controls.AutoCompleteBox.ItemsSource" />.
         /// </summary>
         /// <value>
         /// The custom method that combines the user-entered
-        /// text to and one of the items specified by the
+        /// text and one of the items specified by the
         /// <see cref="P:Avalonia.Controls.AutoCompleteBox.ItemsSource" />.
         /// </value>
-        /// <remarks>
-        /// The AutoCompleteMode is automatically set to Custom if you set
-        /// the TextSelector property.
-        /// </remarks>
+        public AutoCompleteSelector<object> ItemSelector
+        {
+            get { return _itemSelector; }
+            set { SetAndRaise(ItemSelectorProperty, ref _itemSelector, value); }
+        }
+
+        /// <summary>
+        /// Gets or sets the custom method that combines the user-entered
+        /// text and one of the items specified by the
+        /// <see cref="P:Avalonia.Controls.AutoCompleteBox.ItemsSource" />
+        /// in a text-based way.
+        /// </summary>
+        /// <value>
+        /// The custom method that combines the user-entered
+        /// text and one of the items specified by the
+        /// <see cref="P:Avalonia.Controls.AutoCompleteBox.ItemsSource" />
+        /// in a text-based way.
+        /// </value>
         public AutoCompleteSelector<string> TextSelector
         {
             get { return _textSelector; }
@@ -2386,10 +2415,17 @@ namespace Avalonia.Controls
             {
                 text = SearchText;
             }
+            else if (TextSelector != null)
+            {
+                text = TextSelector(SearchText, FormatValue(newItem, true));
+            }
+            else if (ItemSelector != null)
+            {
+                text = ItemSelector(SearchText, newItem);
+            }
             else
             {
-                string formattedValue = FormatValue(newItem, true);
-                text = TextSelector == null ? formattedValue : TextSelector(SearchText, formattedValue);
+                text = FormatValue(newItem, true);
             }
 
             // Update the Text property and the TextBox values