Подтвердить что ты не робот

Автозаполнение для ComboBox в WPF в любом месте в тексте (не только в начале)

У меня есть ComboBox в WPF, с которым я много работал (у него есть собственный шаблон и шаблон настраиваемого элемента). У меня есть все до того момента, когда он работает в значительной степени, как я этого хочу, за исключением того, что когда я вхожу в ComboBox, он выполняет фильтрацию для меня, но только фильтры, предполагающие, что я печатаю, запускают имя элемента в ComboBox.

Например, если у меня есть элемент в ComboBox под названием "Windows Media Player", он найдет его только в том случае, если я начну печатать "Windows Media...", и он не найдет его, если я начну вводить "Media Play"...". Есть ли способ обойти это? Могу ли я установить свойство где-нибудь, чтобы он мог искать его во всей строке, а не просто использовать StartsWith()?

Если нет, то какой был бы лучший способ сделать это сделать это сам? Есть ли способ взять исходный элемент управления и в основном просто изменить вызов на StartsWith() на вызов Contains(), или мне нужно будет идти гораздо более низкоуровневым?

4b9b3361

Ответ 2

Комбобокс теперь поддерживает автозаполнение, просто убедитесь, что в xaml для combobox put

IsEditable="True"

Ответ 3

Насколько я знаю, нет способа заставить стандартный ComboBox вести себя таким образом, просто изменив настройку. Таким образом, вам придется реализовать свой собственный производный код для этого или искать готовый сторонний элемент управления (я считаю, их много).

Ответ 4

Вы можете попробовать обработать события ComboBox TextInput или PreviewTextInput, выполнить поиск текста самостоятельно, выбрать наиболее подходящий элемент и установить "e.Handled = true". Просто мысль. Надеюсь, это поможет!

изменить:

Это работает для одного символа (т.е. если вы введете букву "j", он выберет первый элемент, который содержит "j" или "J" ), но я уверен, что есть способ сделать это с помощью ваш контроль. Наслаждайтесь!

private void MyComboBox_PreviewTextInput(object sender, TextCompositionEventArgs e) {
    foreach (ComboBoxItem i in MyComboBox.Items) {
        if (i.Content.ToString().ToUpper().Contains(e.Text.ToUpper())) {
            MyComboBox.SelectedItem = i;
            break;
        }
    }
    e.Handled = true;
}

Ответ 6

Я думаю, это может помочь. Вы можете изменить фильтр на свои нужды. По умолчанию он ищет, сопоставляя содержимое строки, но вы можете легко изменить условие на StartsWith, если вам нужно...

https://gist.github.com/mariodivece/0bbade976aea8d416d52