Свяжите сочетание клавиш с DelegateCommandв WPF? - PullRequest
0 голосов
/ 19 декабря 2018

Я использую Prism и у меня CompositeCommand в классе ApplicationCommands.cs:

public CompositeCommand ShowSourceFormattingCommand { get; } = new CompositeCommand(true);

У меня DelegateCommand<bool?> зарегистрировано на CompositeCommand:

public DelegateCommand<bool?> ShowSourceFormattingCommand { get; }

...

Services.ApplicationCommands.ShowSourceFormattingCommand.
    RegisterCommand(ShowSourceFormattingCommand);

Затем он связывается с обработчиком команд:

ShowSourceFormattingCommand = 
    new DelegateCommand<bool?>(changeDisplayCommandsHandler.OnShowSourceFormattingSelect).
    ObservesCanExecute(() => IsActive);

...

public void OnShowSourceFormattingSelect(bool? selected)
{
    Services.EventService.GetEvent<ShowSourceFormattingEvent>().Publish(selected ?? false);
}

Это данные, привязанные к ToggleButton в пользовательском интерфейсе и работающие хорошо.Однако, когда я пытаюсь связать с ним комбинацию клавиш, она не работает (используя указанные клавиши).

<KeyBinding Modifiers="Ctrl+Shift" Key="S" 
    Command="{Binding ShowSourceFormattingCommand}" />

Это потому, что для параметра bool нет значения, поэтому он равен нулю.Если этот параметр включен в пользовательском интерфейсе, то сочетание клавиш отключит его, но никогда не включит снова.Обратите внимание, что ComandParameter класса KeyBinding не передается связанной команде, но это не поможет, если это так, потому что мне нужно, чтобы он переключался между истиной и ложью.

<KeyBinding Modifiers="Ctrl+Shift" Key="S" Command="{Binding ShowSourceFormattingCommand}" 
    CommandParameter="True" />

Поэтому я попытался реализовать объект CommandReference, как указано в Как связать нажатие клавиши с DelegateCommand в Composite WPF? , но это дает тот же результат, всегда с параметром nullable boolNULL.

Затем я попытался реализовать другую команду для KeyBinding, которая переключала бы значение:

public CompositeCommand ShowSourceFormattingKeyboardCommand { get; } = 
    new CompositeCommand(true);

... 

public DelegateCommand ShowSourceFormattingKeyboardCommand { get; }

...

Services.ApplicationCommands.ShowSourceFormattingKeyboardCommand.
    RegisterCommand(ShowSourceFormattingKeyboardCommand);

...

ShowSourceFormattingKeyboardCommand = 
    new DelegateCommand(changeDisplayCommandsHandler.OnToggleShowSourceFormattingCommand).
    ObservesCanExecute(() => IsActive);

...

private bool _isSourceFormattingShown = false;

public void OnToggleShowSourceFormattingCommand()
{
    _isSourceFormattingShown = !_isSourceFormattingShown;
    OnShowSourceFormattingSelect(_isSourceFormattingShown);
}

Это работает и корректно включает и выключает функцию, но естьнет индикации в состоянии кнопки при использовании сочетания клавиш.Это то же самое со всеми этими методами.У меня вопрос , как эти булевые команды bool должны быть подключены до ToggleButton для правильного обновления визуального состояния кнопки, например.включить и выключить кнопку?

...