Как разрешить пользователю очистить значение редактируемого ComboBox? - PullRequest
2 голосов
/ 08 апреля 2020

Я ищу способ, позволяющий пользователям вводить пустую строку или очищать значение редактируемого ComboBox в моем приложении UWP. Кажется достаточно простым, но мне пока не повезло.

Вот самый простой код для воспроизведения проблемы. Поместите следующий элемент управления в ваше тестовое приложение:

<ComboBox IsEditable="True">
  <ComboBoxItem>Item 1</ComboBoxItem>
</ComboBox>
  1. Загрузите представление с помощью ComboBox. Обратите внимание, что текст не заполнен.
  2. Выберите «Элемент 1» в поле со списком.
  3. Удалите текст в поле ComboBox.
  4. Нажмите клавишу ввода или выберите фокус ComboBox.

Ожидается: ComboBox примет пустую строку и оставит текст очищенным.
Actual: текст возвращается к тексту ранее выбранного элемента.

Дополнительные примечания:

  1. Версия SDK: 17763 (1809). Обновление версий SDK в данный момент не поддерживается в этом конкретном приложении.
  2. Можно ввести любое непустое значение, но пустые строки нельзя.
  3. Я пробовал ищу свойства, которые позволяют пустые строки, события, на которые я могу подписаться, чтобы настроить поведение, или методы, которые можно переопределить без успеха.

Есть мысли о том, как заставить это работать?

1 Ответ

2 голосов
/ 09 апреля 2020

CharacterReceived, кажется, работает для пустых представлений значений (в отличие от TextSubmitted). следующий код отключится, когда пользователь очистит содержимое:

private void ComboBox_CharacterReceived(UIElement sender, CharacterReceivedRoutedEventArgs args)
{
    if (sender is ComboBox cb)
    {
        Debug.WriteLine($"Char Received: {args.Character}");

        if (args.Character == 8 && string.IsNullOrEmpty(cb.Text))
        {
            Debug.WriteLine("ComboBox Cleared");
        }
    }
}

enter image description here

После подтверждения мы можем сделать еще один шаг и сделать некоторые работают над самим предметом и очищают значение.

Решение

Вот мой пример доказательства концепции, которая достигает желаемой цели. Сначала запустите ComboBox в следующем состоянии (пропускает необходимость выбора элемента 1):

<ComboBox IsEditable="True" 
          CharacterReceived="ComboBox_CharacterReceived" 
          VerticalAlignment="Center"
          HorizontalAlignment="Center"
          SelectedIndex="0"
          Width="200">
    <ComboBoxItem>Item 1</ComboBoxItem>
    <ComboBoxItem>Item 2</ComboBoxItem>
</ComboBox>

Обработчик события (комментарии в строке):

private void ComboBox_CharacterReceived(UIElement sender, CharacterReceivedRoutedEventArgs args)
{
    if (sender is ComboBox cb)
    {
        Debug.WriteLine($"Char Received: {args.Character}");

        // If the ComboBox was cleared
        if (string.IsNullOrEmpty(cb.Text))
        {
            Debug.WriteLine("ComboBox Cleared");

            // Get a reference to the currently editing item (aka "Item 1"
            var item = cb.Items?.FirstOrDefault();

            // Cast it safely with pattern match
            if(item is ComboBoxItem currentItem)
            {
                // TAKEAWAY - Clear the content of the item with an empty string
                currentItem.Content = "";

                // Unselect the item
                cb.SelectedIndex = -1;
            }
        }
    }
}

Часы анимированные GIF результата во время выполнения и вот скриншот

Final Result

Надеюсь, это поможет!

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