В моем случае я не мог использовать решение, которое изначально позволяло снять отметку. Если проверенное состояние инициирует критическую асинхронную операцию, не всегда идеально снимать флажок, чтобы просто проверить его еще раз: зачем разрешать отменять эту операцию, если ее нельзя было вообще отменить?
Для MenuItem
s вы можете подписаться на событие PreviewMouseDown
и установить IsCheckable
в false ; затем подпишитесь на событие Click
и установите IsCheckable
обратно на true . Причина этого в том, что IsCheckable
просто определяет, следует ли инициировать изменение состояния, в отличие от IsHitTestEnabled="false"
и IsEnabled="False"
, что остановит все события от запуска.
Если вы попытаетесь отключить его, никакие последующие события не сработают, что сделает невозможным восстановление проверяемости; сделав его неконтролируемым заранее, мы избежим этой ошибки. Click
также происходит после состояние могло бы быть изменено, поэтому оно работает довольно хорошо.
К сожалению, CheckBox
не имеет эквивалентного свойства IsCheckable
; однако те же самые концепции, описанные выше (т. е. шаблон PreviewMouseDown
, Click
), могут дать аналогичный, если не идентичный, результат.