代码之家  ›  专栏  ›  技术社区  ›  Sheridan

将键盘快捷键与delegatecommand关联<bool?>在wpf?

  •  2
  • Sheridan  · 技术社区  · 6 年前

    我在用棱镜 CompositeCommand 在一个 ApplicationCommands.cs 班级:

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

    我有一个 DelegateCommand<bool?> 注册于此 复合命令 以下内容:

    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 类不会传递给相关联的命令,但如果是,它也不会有帮助,因为我需要它在true和false之间交替。

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

    因此,我尝试执行 CommandReference 对象,如 How do I associate a keypress with a DelegateCommand in Composite WPF? ,但它给出的结果相同,可为空的bool参数始终为空。

    然后我尝试执行另一个命令 键绑定 ,这将切换值:

    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命令应该如何连接到 切换按钮 要正确更新按钮的视觉状态,例如打开和关闭按钮?

    0 回复  |  直到 6 年前