RegisterClassCommandBinding не запускает CanExecute

1

В некоторых ситуациях (я не мог установить шаблон) исполнение заканчивается

    System.Windows.Input.CommandManager.InvalidateRequerySuggested();
    var can = GlobalCommands.UpdateWindowTitle.CanExecute(title, null);
    GlobalCommands.UpdateWindowTitle.Execute(title, null);

без ввода методов CanExecute или Execute. Переменная "can" имеет значение false (без выполнения CanExecute), и команда никогда не срабатывает. Но иногда он работает так, как ожидалось.

Так создается и привязывается команда:

    var updateTitleBinding = new CommandBinding(GlobalCommands.UpdateWindowTitle,         UpdateWindowTitle, CanUpdateWindowTitle);
    CommandManager.RegisterClassCommandBinding(typeof(System.Windows.Window), updateTitleBinding);

Я не могу использовать

    Application.Current.MainWindow.CommandBindings.Add(
         new CommandBinding(_addCommand, ExecuteAddCommand, CanExecuteAddCommand));

потому что вызывающий класс не является визуальным элементом и не имеет CommandBindings

Я попробовал позвонить

    System.Windows.Input.CommandManager.InvalidateRequerySuggested();

перед вызовами CanExecute и Execute, но это не влияет на поведение.

-

Вы знаете, что может там происходить? Есть ли другие шаблоны, которые я мог бы использовать?

Проблема выглядит похожей на метод CanExecute, который вызывает ложную проблему, но я нигде не настраиваю фокус.

Благодарю!

Теги:
wpf
command
routed-commands

1 ответ

1
Лучший ответ

Ну, так как вы передаете нулевое значение для цели, что означало бы, что инфраструктура будет маршрутизироваться на основе Keyboard.FocusedElement, так что либо это нулевое значение (что может случиться, если приложение неактивно или фокус клавиатуры находится в чем-то еще, как HwndHost или MessageBox) или Keyboard.FocusedElement не является нулевым, но не внутри визуального/логического кода окна.

  • 0
    Это звучит как правильный ответ в некоторых ситуациях. В моем случае я пытался вызвать RegisterClassCommandBinding, который не удался, потому что он используется для регистрации команды только один раз, без возможности отписаться. Я перестал использовать команды и начал использовать делегатов вместо этого, что решило проблему в моем случае. См. Stackoverflow.com/questions/6388701/…

Ещё вопросы

Сообщество Overcoder
Наверх
Меню