将键盘快捷键与WPF中的DelegateCommand <bool?>相关联吗?

时间:2018-12-19 13:38:28

标签: wpf prism nullable key-bindings delegatecommand

我正在使用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);
}

它是绑定到UI中的ToggleButton的数据,并且运行良好。但是,当我尝试将键盘快捷方式与其关联时,它不起作用(使用指定的键)。

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

这是因为bool参数没有值,因此为null。如果在用户界面中启用了该选项,则键盘快捷键会将其禁用,但再也不会启用。请注意,ComandParameter类的KeyBinding不会传递给关联的命令,但是如果传递给了它,那将无济于事,因为我需要它在true和false之间交替。

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

因此,我尝试实现How do I associate a keypress with a DelegateCommand in Composite WPF?中指定的CommandReference对象,但是它给出了相同的结果,nullable bool参数始终为null。

然后我尝试为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以正确更新按钮的视觉状态,例如。开启和关闭按钮?

0 个答案:

没有答案