Я зашел в тупик при разработке приложения .NET для Windows Forms. Проблема связана с переключением фокуса между элементами управления и с тем, как он поддерживает поддержание состояний элемента управления формы.
В пользовательском интерфейсе есть три основных элемента управления - два поля со списком и кнопка.
- Оба поля со списком начинаются с
SelectedItem = null
.
- Оба поля со списком имеют явный набор допустимых опций, которые можно выбрать.
- В обоих полях со списком используется
AutoCompleteMode.SuggestAppend
, для AutoCompleteSource
установлено значение AutoCompleteSource.ListItems
. Это означает, что пользователи могут вводить в поля со списком и предлагать всплывающие подсказки для выбора значения.
- ComboBox # 1 всегда включен.
- ComboBox # 2 отключен, если в ComboBox # 1 не выбрано определенное значение.
- Кнопка активна только когда:
- Допустимое значение было выбрано из всегда включенного поля со списком.
- Допустимое значение было выбрано из второго поля со списком IFF определенное значение было выбрано в первом поле со списком. В противном случае его значение игнорируется.
- Во всех остальных случаях он отключен.
Проблема заключается в навигации по клавиатуре и фокусе управления, а также в том, как они взаимодействуют с логикой, связанной с поддержанием состояний Enabled
различных элементов управления.
В двух словах, при выборе значения для поля со списком нажатие клавиши TAB (чтобы сделать выбор для поля со списком) дает фокус следующему элементу управления в форме (согласно порядку TabIndex) ДО логики для включения / Запретить управление запущено.
Логика включения / выключения элементов управления происходит в событиях Validating / Validated соответствующих комбинированных полей.
Конечным результатом является то, что элемент управления можно отключить ПОСЛЕ того, как ему был дан фокус.
Например:
- Включен только ComboBox # 1. ComboBox # 2 и кнопка отключены. Все выбранные элементы ComboBox имеют нулевое значение.
- Установите фокус на ComboBox # 1.
- Введите первые несколько букв допустимого параметра для поля.
- Нажмите клавишу TAB.
Когда я нажимаю клавишу TAB, кажется, что фокус передается следующему элементу управления до изменения SelectedItem. Бизнес-логика для включения или отключения других элементов управления пользовательского интерфейса не может быть запущена, пока SelectedItem не будет изменен.
В идеале, я хочу наоборот: фокус должен быть смещен ПОСЛЕ того, как SelectedItem элемента управления UI был обновлен, поэтому была запущена логика для обновления состояний элемента управления.
У кого-нибудь есть предложения относительно того, как я могу это сделать?