2009-02-06 26 views
29

Mam ComboBox w WPF, który całkiem spartaczyłem (ma niestandardowy szablon i niestandardowy szablon przedmiotu). Mam już do punktu, w którym działa prawie tak, jak chcę, z wyjątkiem tego, że po wpisaniu do ComboBox robi filtrowanie dla mnie, ale tylko filtry przy założeniu, że wpisuję, zaczynają nazwę elementu w ComboBox.Autouzupełnianie dla ComboBox w WPF w dowolnym miejscu w tekście (nie tylko na początku)

Na przykład, jeśli mam element w ComboBox o nazwie "Windows Media Player", będzie go można znaleźć tylko wtedy, gdy zacznę pisać "Windows Media ..." i nie będzie go można znaleźć, gdy zacznę pisać "Media Play" ... ". Czy jest jakiś sposób obejścia tego? Czy mogę ustawić właściwość gdzieś, aby polecić jej wyszukiwanie w całym łańcuchu, a nie tylko przy użyciu StartsWith()?

Jeśli nie, jaki byłby najlepszy sposób na zrobienie tego samemu? Czy jest jakiś sposób na przejęcie pierwotnej kontroli i zasadniczo wystarczy zmienić wywołanie funkcji StartsWith() na wywołanie Contains(), czy też musiałbym przejść o wiele bardziej na niższy poziom?

Odpowiedz

4

O ile mi wiadomo, nie ma sposobu, aby zmusić standardowe ComboBox do zachowania się w ten sposób, po prostu zmieniając ustawienie. Musisz więc zaimplementować swoją własną pochodną w polu kombi lub wyszukać gotową kontrolę zewnętrzną (uważam, że jest ich dużo).

4

Możesz spróbować obsługi zdarzeń ComboBox TextInput lub PreviewTextInput, wykonując wyszukiwanie tekstowe samodzielnie, wybierając najbardziej odpowiedni element i ustawiając "e.Handled = true". Tylko myśl. Mam nadzieję że to pomoże!

edit:

To działa dla pojedynczego znaku (czyli po wpisaniu litery „J”, to wybierz pierwszy element, który zawiera „j” lub „J”), ale jestem pewien, jest sposób, aby to zrobić ze swoją kontrolą. Cieszyć się!

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; 
} 
2

WPF Combo box nie obsługuje autouzupełniania

Oto przykład, który pozwala zrobić to w sposób pośredni, poprzez zastosowanie filtra do przedmiotów.

Zobacz http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/cec1b222-2849-4a54-bcf2-03041efcf304/

+2

kod pod tym linkiem nie pojawia się już do pracy i to autor mówi, że jest zbyt zajęty, aby to naprawić. – Tion

+1

W rzeczywistości, nieedytowalne elementy ComboBox automatycznie wybierają elementy na liście w oparciu o naciśnięcia klawiszy podczas ustawiania ostrości. Jestem prawie pewien, że o tym mówią. Jeśli masz listę stanów, przechodzenie do ComboBox i uderzanie F wybierze Florida. Dopóki nie zdefiniujesz niestandardowego szablonu przedmiotu, który znalazłem, łamie to zachowanie "autouzupełniania". – steviesama

38

combobox obsługuje autouzupełnianie, wystarczy upewnić się w XAML dla combobox umieścić

IsEditable="True" 
+11

Niestety, dzięki temu użytkownicy mogą wprowadzać nieprawidłowe dane, trzeba będzie dodać więcej logiki/obsługi zdarzeń. –

Powiązane problemy