2009-02-06 4 views
29

Ho un ComboBox in WPF con cui ho fatto un sacco di cose (ha un modello personalizzato e un modello di oggetto personalizzato). Sono arrivato al punto in cui ora funziona più o meno come lo voglio, tranne che quando scrivo nel ComboBox fa il filtro per me, ma solo i filtri assumendo quello che scrivo inizia il nome dell'elemento in il ComboBox.Completamento automatico per ComboBox in WPF ovunque nel testo (non solo all'inizio)

Ad esempio, se nel ComboBox è presente un elemento denominato "Windows Media Player", lo troverò solo se inizi a digitare "Windows Media ..." e non lo troverà se inizio a digitare "Media Play ... ". C'è un modo per aggirare questo? Posso impostare una proprietà da qualche parte per dirgli di cercare nell'intera stringa invece di usare semplicemente StartsWith()?

In caso contrario, quale sarebbe il modo migliore per farlo facendolo da solo? C'è un modo per prendere il controllo originale e in pratica basta cambiare la chiamata a StartsWith() a una chiamata a Contains(), o dovrei andare molto più a basso livello?

risposta

4

Per quanto ne so non c'è modo di forzare ComboBox standard a comportarsi in questo modo semplicemente cambiando un'impostazione. Quindi dovrai implementare la tua derivata della casella combinata o cercare controlli di terze parti già pronti (credo che ce ne siano molti).

4

Si potrebbe provare a gestire gli eventi TextInput o PreviewTextInput di ComboBox, effettuare da soli la ricerca del testo, selezionare l'elemento più appropriato e impostare "e.Handled = true". Solo un pensiero. Spero che questo ti aiuti!

edit:

Questo funziona per un singolo carattere (ad esempio se si immette la lettera "j", selezionerà il primo elemento che contiene una "j" o "J"), ma sono sicuro che c'è un modo per farlo con il tuo controllo. Godere!

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 non supportano Autocomplete

Ecco un esempio che ti permette di fare questo in modo indiretto, mediante l'applicazione di un filtro per le voci.

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

+2

il codice a questo link non sembra funzionare ed è autore dice che è troppo impegnato a ripararlo. – Tion

+1

In realtà, i ComboBox non modificabili selezioneranno automaticamente gli elementi nell'elenco in base alle sequenze di tasti mentre il controllo è attivo. Sono abbastanza sicuro che sia di questo che stanno parlando. Se si dice di avere un elenco di stati, l'inserimento di schede nel ComboBox e il raggiungimento di F selezionerà la Florida. A meno che non si definisca un modello di articolo personalizzato che ho trovato interrompe questo comportamento di "completamento automatico". – steviesama

38

La casella combinata supporta ora di completamento automatico, basta assicurarsi in XAML per la casella combinata messo

IsEditable="True" 
+11

Sfortunatamente ciò consente agli utenti di inserire dati non validi, sarà necessario aggiungere più logica/gestione degli eventi. –

0

penso che questo potrebbe aiutare. Puoi cambiare il filtro in base alle tue esigenze. Per impostazione predefinita, esso cerca facendo corrispondere il contenuto della stringa, ma si può facilmente cambiare la condizione per StartsWith se avete bisogno di ...

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