Laden...

Combobox - Autovervollständigung

Erstellt von blackdynamic vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.782 Views
B
blackdynamic Themenstarter:in
51 Beiträge seit 2010
vor 13 Jahren
Combobox - Autovervollständigung

Hallo Community,

ich möchte meine Combobox mit einer Autovervollständigung ausrüsten.
Die "Suchfunktion" habe ich schon benutzt, allerdings ergab sie keine Treffer.

Hier ist mein Code-Snippet:


MainWindow.xaml:

<ComboBox Height="30" Width="200" IsEditable="True" ItemsSource="{Binding}" IsTextSearchEnabled="False" Name="comboBox">
            <ComboBox.ItemsPanel>
                <ItemsPanelTemplate>
                    <VirtualizingStackPanel IsVirtualizing="True" IsItemsHost="True" />
                </ItemsPanelTemplate>
            </ComboBox.ItemsPanel>
            
</ComboBox>

MainWindow.cs:

public MainWindow()
        {
            InitializeComponent();

            List<String> names = new List<string>();
            names.Add("Michael");
            names.Add("Mike");
            names.Add("Manuel");
            names.Add("Olaf");
            this.DataContext = names;
            comboBox.Loaded += delegate
            {
                TextBox textbox = comboBox.Template.FindName("PART_EditableTextBox", comboBox) as TextBox;
                Popup popup = comboBox.Template.FindName("PART_Popup", comboBox) as Popup;

                textbox.AutoWordSelection = false;

                if (textbox != null)
                {
                    textbox.TextChanged += delegate
                    {
                        if (textbox.Text != String.Empty)
                        {
                            popup.IsOpen = true;
                            comboBox.Items.Filter += text =>
                                {
                                    if (text.ToString().Contains(textbox.Text))
                                        return true;
                                    return false;
                                };
                        }
                        else
                        {
                            popup.IsOpen = false;
                            comboBox.Items.Filter = null;
                        }
                    };
                }
            };
        }


Ich habe nun 2 Probleme:

  1. Wenn ein Buchstabe geschrieben wird, wird dieser direkt zu Beginn markiert.
    Das bedeutet es ist nicht möglich, z.B. "Michael" hintereinander zu schreiben.
    Denn das "M" wird direkt markiert, sodass im Endeffekt dann "ichael" in der Textbox steht. Man muss also erst "M" schreiben, dann die Markierung per Hand wegmachen und "ichael" hinterher schreiben.

Gibt es eine Möglichkeit, diese automatische Markierung nach einem Zeichen auszustellen?

  1. Wenn ich einen Namen ausgesucht habe, und diesen aus der Textbox lösche bleibt er trotzdem in der Textbox ausgewählt.
    Im Debugger ist zu sehen, dass das TextChanged Event 2 mal geschmissen wird. Zuerst mit dem Text "", was meiner Erwartungshaltung entspricht.
    Daraufhin wird auch der Filter der Combobox (vermutlich) korrekt gesetzt.
    Das Problem ist nun, dass danach direkt noch ein TextChanged Event geschmissen wird, welches der Textbox wieder den Wert gibt, den sie vorher hatte. Ich habe keine Ahnung wer dieses Event schmeißt und warum es plötzlich den Wert der Textbox wieder zurück setzt.

Könnt ihr mir sagen wie ich dieses zweite TextChanged Event unterbinden kann und wo es her kommt bzw. wer es schmeißt?

Ich würde mich freuen, wenn ihr mir helfen würdet.

Viele Grüße