Страницы

Поиск по вопросам

суббота, 14 декабря 2019 г.

Живой поиск System.Windows.Controls.ComboBox C# WPF

#c_sharp #wpf #combobox #фильтр


Добрый день/вечер, столкнулся с задачей сделать контекстный поиск в Windows.Controls.ComboBox.
Поиск производится по любому вхождению.
Например имеем: Вася, Федя, Вика
Набираем "в", получаем: Вася, Вика; "ва" остается Вася; "дя" - Федя.
Надеюсь смысл понятен.
Доработал класс ComboBox:

using System.Collections.Generic;
using System.Linq;
using System.Windows.Controls;
using ProgrammingWeapons;

namespace Telemetria.UI
{
    public class ComboBoxFinder : ComboBox
    {
        private bool _isAutoFilter = true;
        public bool IsAutoFilter {
            get { return _isAutoFilter; }
            set { _isAutoFilter = value; }
        }

        private readonly List _fullList;
        private string _filterText { get; set; }
        public ComboBoxFinder() {
            IsTextSearchEnabled = false; // отключение автовыбора первого элемента,
иначе не работает поиск
            _fullList = new List();
            _filterText = "";

            KeyUp += (sender, args) => Filter(Text);
            KeyDown += (sender, args) => {
                if (_isAutoFilter) IsDropDownOpen = true;
                Filter(Text);
            };
            SelectionChanged += (sender, args) => {
                //if(SelectedItem != null)
                    Filter("");
            };
        }

        public void Filter(string text) {
            if (!_isAutoFilter) return;
            if (text.IsNull()) return;

            _filterText = text;
            if (_fullList.Count < 1)
                foreach (var isc in Items.SourceCollection)
                    _fullList.Add(isc);

            var tmpSourceList = _fullList.Where(fl => fl != null && fl.ToString().ToUpper().Contains(_filterText.ToUpper())).ToList();
            //if (tmpSourceList.Count == 1) return;
            ItemsSource = tmpSourceList;
        }
    }
}


Вроде как выполняется то что нужно, но работает как-то криво.
Когда выбираешь первый раз элемент отображается в заголовка, начинаю печатать для
второго поиска, первая буква печатается и потом исчезает, нужно вводить ее снова, после
чего все фильтруется нормально. Или второй вариант при попытке напечатать текст выскакивает
выбранный элемент и данные не фильтруются.

Какая ошибка когда появляется пока не пойму. Подскажите куда смотреть. WinForms использовать
нельзя, т.к. не вписывается в проект. В интернете ничего не нарыл, такое ощущение что
все под WinForms пишут (
    


Ответы

Ответ 1



У меня работает так: XAML: Code-behind: void OnComboboxTextChanged(object sender, RoutedEventArgs e) { CB.IsDropDownOpen = true; // убрать selection, если dropdown только открылся var tb = (TextBox)e.OriginalSource; tb.Select(tb.SelectionStart + tb.SelectionLength, 0); CollectionView cv = (CollectionView)CollectionViewSource.GetDefaultView(CB.ItemsSource); cv.Filter = s => ((string)s).IndexOf(CB.Text, StringComparison.CurrentCultureIgnoreCase) >= 0; } Результат:

Комментариев нет:

Отправить комментарий