7
votes

WPF Combobox avec iSeditable = "vrai" - Comment puis-je indiquer qu'aucun match n'a été trouvé?

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>


1 commentaires

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.


3 Réponses :


3
votes

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


1 commentaires

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 jusqu'à ce que 5 'F a été entrée, 4 sera ajouté au texte). Je n'ai pas encore eu de solution pour cela.



1
votes

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 xxx

sauf si la liaison continue à ajouter des enregistrements à la liste déroulante, je pense être un plus Recherche efficace


0 commentaires

2
votes

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


0 commentaires