C# WPF - Combobox 3 tematy

0

Witam.

  1. Po wpisaniu w combobox'a jakiegoś znaku zawsze zaznacza pierwszy znak, jak piszę dalej to pierwszy znak zostanie usunięty, jak to zmienić ?
    user image
    Wpisując ciągiem "123" po kliknięciu 1 pojawia się i zaznacza, pisząc dalej 23 zostaje mi tylko "23" w combobox'ie.
  2. Zrobiłem sobie tak że po wpisaniu każdego kolejnego znaku lista jest przepisywana problem w tym że jak kliknę strzałkę w dół zaznacza mi pierwszą dopasowaną wartość, chciał bym żeby działało to tak, że jak poruszam się po liście strzałkami to dopiero wywołanie klawisza enter wybiera daną wartość.
  3. Równocześnie chciał bym aby combobox wyświetlał mi datagrida z różnymi wartościami które będę mógł przeszukiwać. Jak to rozwiązać ?
    Z góry dziękuję za pomoc.
    Poniżej kod:
<ComboBox x:Name="cbFirma" IsEditable="True" IsTextSearchEnabled="False" IsSynchronizedWithCurrentItem="False" Width="90" SelectionChanged="cbFirma_SelectionChanged"/>
List<Firma> firmy = new List<Firma>();
Firma firma = new Firma();
firmy = firma.pobierzDane(false);
cbFirma.ItemsSource = firmy; // mapuje wszystkie wartości do combobox'a
cbFirma.DisplayMemberPath = "nazwa"; // mapuje wartości do combobox'a
cbFirma.SelectedValuePath = "id"; // mapuje id do combobox'a
cbFirma.AddHandler(System.Windows.Controls.Primitives.TextBoxBase.TextChangedEvent, new System.Windows.Controls.TextChangedEventHandler(cbFirma_TextChanged)); // Funkcja dodaje to comboboxa akcję po wpisaniu textu
        private void cbFirma_TextChanged(object sender, TextChangedEventArgs e)
        {
            cbFirma.IsDropDownOpen = true;
            List<Firma> results = firmy.FindAll(x => x.nazwa.ToUpperInvariant().Contains(cbFirma.Text.ToUpperInvariant()));
            cbFirma.ItemsSource = results; // mapuje wyszukane wartości do combobox'a
        }

        private void cbFirma_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (cbFirma.SelectedItem != null)
            {
                Firma drv = (Firma)cbFirma.SelectedItem;
                lfirma.Content = drv.nazwa;
            }
            else lfirma.Content = "";
        }

Jedna zależność jaką zauważyłem to że jeśli combobox jest ustawiony na iseditable="false" to przyciski dół góra działają prawidłowo. Sęk w tym że jak ustawię wartość na True to chciał bym aby przyciski zachowywały się tak jak myszka czyli tylko podświetlały wartość a po przyciśnięciu enter'a wartość została wybrana.

0

AD. 1.
Pierwszy problem rozwiązany:

bool _firstKey = true;
        private void cbFirma_KeyUp(object sender, KeyEventArgs e) // jeśli pierwszy przycisk został wpisany odznacza go
        {
            var textbox = (TextBox)cbFirma.Template.FindName("PART_EditableTextBox", cbFirma);
            if (textbox != null && _firstKey && textbox.SelectionLength > 0)
            {
                textbox.Select(textbox.SelectionLength, 0);
                _firstKey = false;
            }
        }

Jeśli pierwszy przycisk został "puszczony" odznacza go.

0

Czemu tych rzeczy nie robisz w WPF?

1 użytkowników online, w tym zalogowanych: 0, gości: 1