Как отключить маркировку первого ввода - PullRequest
1 голос
/ 17 июня 2019

Я создал редактируемый ComboBox для поиска (фильтрации), как Google.Я использую ActionHandler "KeyUp", и первый ввод выделяется и перезаписывается.Как я могу отключить перезапись или выделение?

private void CbInKuLi_KeyUp(object sender, System.Windows.Input.KeyEventArgs e)
{
    CollectionView itemsViewOriginal = (CollectionView)CollectionViewSource.GetDefaultView(cbInKuLi.ItemsSource);

    itemsViewOriginal.Filter = ((o) =>
    {
        if (String.IsNullOrEmpty(cbInKuLi.Text)) return true;
        else
        {
            DeKreditor x = (DeKreditor)o;
            string filterText = cbInKuLi.Text;

            if (x.Nummer.ToLowerInvariant().Contains(filterText)
            || (!string.IsNullOrWhiteSpace(x.Firma) && x.Firma.ToLowerInvariant().Contains(filterText))
            || (!string.IsNullOrWhiteSpace(x.Vorname) && x.Vorname.ToLowerInvariant().Contains(filterText))
            || (!string.IsNullOrWhiteSpace(x.Name) && x.Name.ToLowerInvariant().Contains(filterText)))
                return true;
            else
                return false;
        }
    });

    itemsViewOriginal.Refresh();

    cbInKuLi.IsDropDownOpen = true;
}

XAML:

<ComboBox   
    x:Name="cbInKuLi" 
    StaysOpenOnEdit="True"  
    IsEditable="True" 
    IsTextSearchEnabled="False" 
    HorizontalAlignment="Stretch" 
    VerticalAlignment="Center" 
    Grid.Row="0" 
    Grid.Column="1" 
    Margin="5,0,5,5" 
    SelectionChanged="CbInKuLi_SelectionChanged" 
    KeyUp="CbInKuLi_KeyUp" 
    TextOptions.TextFormattingMode="Ideal" />

1 Ответ

1 голос
/ 17 июня 2019

Выделение текста вызвано тем, что для IsDropDownOpen установлено значение true. Редактируемый ComboBox автоматически выбирает текст, если он открыт, поэтому вы можете получить TextBox из шаблона ComboBox по его имени, а затем установить длину выделения в ноль в конце текста.

private void CbInKuLi_KeyUp(object sender, System.Windows.Input.KeyEventArgs e)
    {
        CollectionView itemsViewOriginal = (CollectionView)CollectionViewSource.GetDefaultView(cbInKuLi.ItemsSource);

        itemsViewOriginal.Filter = ((o) =>
        {
            if (String.IsNullOrEmpty(cbInKuLi.Text)) return true;
            else
            {
                Model x = (Model)o;
                string filterText = cbInKuLi.Text;

                if (x.Text.ToLowerInvariant().Contains(filterText))
                    return true;
                else
                    return false;
            }
        });

        itemsViewOriginal.Refresh();
        cbInKuLi.IsDropDownOpen = true;
        var textbox = (TextBox)cbInKuLi.Template.FindName("PART_EditableTextBox", cbInKuLi);
        textbox.Select(textbox.Text.Length, textbox.Text.Length);
    }

UPDATE:

Из комментариев вы можете заменить последнюю строку следующей строкой, и она лучше оригинальной:

textbox.CaretIndex = textbox.Text.Length;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...