Есть ли простой способ предложить пользователю подтвердить изменение выбора со списком и не обработать изменение, если пользователь не выбрал?Как отменить событие ComboBox SelectionChanged?
У нас есть поле со списком, в котором изменение выбора приведет к потере данных. В основном пользователь выбирает тип, тогда они могут вводить атрибуты этого типа. Если они меняют тип, мы очищаем все атрибуты, поскольку они больше не могут применяться. Проблема в том, что под подбором вы снова делаете событие SelectionChanged
.
Вот отрывок:
if (e.RemovedItems.Count > 0)
{
result = MessageBox.Show("Do you wish to continue?",
"Warning", MessageBoxButton.YesNo, MessageBoxImage.Warning);
if (result == MessageBoxResult.No)
{
if (e.RemovedItems.Count > 0)
((ComboBox)sender).SelectedItem = e.RemovedItems[0];
else
((ComboBox)sender).SelectedItem = null;
}
}
У меня есть два решения, ни один из которых я люблю.
После того как пользователь выбирает «Нет», удалить обработчик события
SelectionChanged
, изменить выбранный элемент, а затем зарегистрировать обработчик событияSelectionChanged
снова. Это означает, что вам нужно удерживать ссылку обработчика события в классе, чтобы вы могли добавлять и удалять его.Создайте
ProcessSelectionChanged
boolean как часть класса. Всегда проверяйте его в начале обработчика событий. Установите для него значение false до того, как мы изменим выделение назад, а затем снова вернем его в true. Это будет работать, но я не люблю использовать флаги, чтобы в основном свернуть обработчик событий.
У кого-нибудь есть альтернативное решение или усовершенствование тех, о которых я упоминаю?
Это старый, но будет http://stackoverflow.com/questions/314503/how-to-prevent-cancel-a-comboboxs-value-change-in-c помочь? –
Я собирался сказать, почему вы не используете javascript для этой проверки, но потом я заметил его приложение winform извините :( – JonH
Флаг bool - это стандартное решение. Не указывая пользователю способ выбора элемента, просто не включая его в коллекции Items является хорошим решением. –