Browse Source

Implement TextSearch attached property

pull/7594/head
Luis von der Eltz 4 years ago
parent
commit
5de79b1c3d
  1. 25
      src/Avalonia.Controls/Primitives/SelectingItemsControl.cs
  2. 37
      src/Avalonia.Controls/Primitives/TextSearch.cs

25
src/Avalonia.Controls/Primitives/SelectingItemsControl.cs

@ -531,11 +531,28 @@ namespace Avalonia.Controls.Primitives
_textSearchTerm += e.Text;
bool match(ItemContainerInfo info) =>
info.ContainerControl is IContentControl control &&
control.Content?.ToString()?.StartsWith(_textSearchTerm, StringComparison.OrdinalIgnoreCase) == true;
bool Match(ItemContainerInfo info)
{
foreach (var child in info.ContainerControl.GetVisualDescendants().OfType<Control>())
{
if (!child.IsSet(TextSearch.TextProperty))
{
continue;
}
var searchText = child.GetValue(TextSearch.TextProperty);
var info = ItemContainerGenerator?.Containers.FirstOrDefault(match);
if (searchText?.StartsWith(_textSearchTerm, StringComparison.OrdinalIgnoreCase) == true)
{
return true;
}
}
return info.ContainerControl is IContentControl control &&
control.Content?.ToString()?.StartsWith(_textSearchTerm, StringComparison.OrdinalIgnoreCase) == true;
}
var info = ItemContainerGenerator?.Containers.FirstOrDefault(Match);
if (info != null)
{

37
src/Avalonia.Controls/Primitives/TextSearch.cs

@ -0,0 +1,37 @@
using Avalonia.Interactivity;
namespace Avalonia.Controls.Primitives
{
/// <summary>
/// Allows to customize text searching in <see cref="SelectingItemsControl"/>.
/// </summary>
public static class TextSearch
{
/// <summary>
/// Defines the Text attached property.
/// This text will be considered during text search in <see cref="SelectingItemsControl"/> (such as <see cref="ComboBox"/>)
/// </summary>
public static readonly AttachedProperty<string> TextProperty
= AvaloniaProperty.RegisterAttached<Interactive, string>("Text", typeof(TextSearch));
/// <summary>
/// Sets the <see cref="TextProperty"/> for a control.
/// </summary>
/// <param name="control">The control</param>
/// <param name="text">The search text to set</param>
public static void SetText(Control control, string text)
{
control.SetValue(TextProperty, text);
}
/// <summary>
/// Gets the <see cref="TextProperty"/> of a control.
/// </summary>
/// <param name="control">The control</param>
/// <returns>The property value</returns>
public static string GetText(Control control)
{
return control.GetValue(TextProperty);
}
}
}
Loading…
Cancel
Save