Utilisation de la zone de texte simple suivante à titre d'exemple:
<ComboBox IsEditable="True" SelectedItem="{Binding}"> <ComboBoxItem>Angus/ComboBoxItem> <ComboBoxItem>Jane</ComboBoxItem> <ComboBoxItem>Steve</ComboBoxItem> </ComboBox>
3 Réponses :
En tant que démarreur, vous voudrez peut-être laisser l'utilisateur de voir s'ils tapent dans l'une des options disponibles.
1) Recherche "Autocomplete Combobox" en ligne. P>
2) Vérifiez celles-ci : P>
http: //weblogs.asp .NET / OKLOETEN / Archive / 2007/11/12 / 5088649.aspx P>
http://www.codeproject.com/kb/wpf/wpfcincustomcombox.aspx p>
3) Essayez également ceci: P>
private void myComboBox_KeyUp(object sender, KeyEventArgs e) { // Get the textbox part of the combobox TextBox textBox = myComboBox.Template.FindName("PART_EditableTextBox", myComboBox) as TextBox; // holds the list of combobox items as strings List<String> items = new List<String>(); // indicates whether the new character added should be removed bool shouldRemove = true; for (int i = 0; i < myComboBox.Items.Count; i++) { items.Add(((ComboBoxItem)myComboBox.Items.GetItemAt(i)).Content.ToString()); } for (int i = 0; i < items.Count; i++) { // legal character input if(textBox.Text != "" && items.ElementAt(i).StartsWith(textBox.Text)) { shouldRemove = false; break; } } // illegal character input if (textBox.Text != "" && shouldRemove) { textBox.Text = textBox.Text.Remove(textBox.Text.Length - 1); textBox.CaretIndex = textBox.Text.Length; } }
Il y a un bogue dans ce code - il est possible de maintenir une clé et du code comme écrit ne supprimera que le dernier caractère. (E.G. Si l'utilisateur détient la touche f code> jusqu'à ce que 5 'F a été entrée, 4 sera ajouté au texte). Je n'ai pas encore eu de solution pour cela.
C'est une bonne solution jusqu'à ce que vous ayez beaucoup d'enregistrements dans la liste déroulante. Je le ferais de cette façon:
Déclarez ceci en haut du fichier p> sauf si la liaison continue à ajouter des enregistrements à la liste déroulante, je pense être un plus Recherche efficace p> p>
Cette solution est basée sur la réponse d'User1234567, avec quelques modifications. Au lieu de rechercher la liste des articles, il vérifie simplement la sélection de la valeur de ComboBox pour une valeur> = 0 Pour voir si une correspondance a été trouvée et qu'elle résout la préoccupation de RB de maintenir une touche insérée plus d'un caractère. Il ajoute également un retour audible lorsqu'il rejette les caractères.
private int _lastMatchLength = 0; private void myComboBox_GotFocus(object sender, RoutedEventArgs e) { _lastMatchLength = 0; } private void myComboBox_KeyUp(object sender, KeyEventArgs e) { ComboBox cBox = sender as ComboBox; TextBox tb = cBox.Template.FindName("PART_EditableTextBox", cBox) as TextBox; if (tb != null) { if (cBox.SelectedIndex >= 0) { _lastMatchLength = tb.SelectionStart; } else if (tb.Text.Length == 0) { _lastMatchLength = 0; } else { System.Media.SystemSounds.Beep.Play(); tb.Text = tb.Text.Substring(0, _lastMatchLength); tb.CaretIndex = tb.Text.Length; } } }
Un astuce mon enseignant WPF a répété des dizaines de fois au cours du cours: Dans WPF, vous ne devez jamais utiliser explicitement sélectionnée. C'est ce que les vues de collecte sont pour.