在 MVVM 中禁用键绑定

Disable Keybindings in MVVM

我的 WPF 应用程序中有一个菜单。一些菜单项也可以通过快捷方式调用。但我希望一些快捷方式不总是处于活动状态。

我尝试了各种代码但都卡住了。这是我目前的做法:

<Window.CommandBindings>
    <CommandBinding Command="{x:Static views:MainWindow.SavePartCommand}"
                    Executed="SavePartExecuted"
                    CanExecute="SavePartCanExecute"/>
</Window.CommandBindings>
<Window.InputBindings>
    <KeyBinding Command="{x:Static views:MainWindow.SavePartCommand}" 
                Key="S" Modifiers="Ctrl" />
</Window.InputBindings>

但是 SavePartCommand 未被识别,如果我在我的代码隐藏中定义它,我不知道如何 link 该静态命令到我的实际 MVVM 模型。

我通过像这样在我的代码隐藏中完全定义键绑定来解决它

this.InputBindings.Add(new KeyBinding(((MainViewModel) this.DataContext).  
                           SavePartCommand, new KeyGesture(Key.S, ModifierKeys.Control)));

我看你已经解决了。好。

不过,如果有任何代码隐藏代码,w/o 执行此操作的一种方法是从您的视图模型修改静态命令的 CanExecute 逻辑。

假设您有一个 MainWindow,它的数据上下文为 MainViewModel,您的菜单相关命令为静态 Commands class。然后为 MainWindow 考虑以下 XAML。

// xmlns:app="clr-namespace:<app_namespace>"
<Window.DataContext>
    <viewModel:MainViewModel />
</Window.DataContext>

<Window.CommandBindings>
    <CommandBinding Command="{x:Static app:Commands.SavePartCommand}" />
</Window.CommandBindings>
<Window.InputBindings>
    <KeyBinding Command="app:Commands.SavePartCommand" Key="S" Modifiers="Ctrl" />
</Window.InputBindings>

这基本上与您发布的代码相同,但未指定事件处理程序。在 MainViewModel 中,您只需指示 SavePartsCommand 不可用。

public class MainViewModel
{
    public MainViewModel()
    {
        Commands.ToggleCanExecuteSavePartsCommand = true;
    }
}

然后实际的(虚拟)命令可能如下所示。

public static class Commands
{
    private static RelayCommand _savePartsCommand;

    public static ICommand SavePartCommand
    {
        get
        {
            return _savePartsCommand ?? 
                (_savePartsCommand = new RelayCommand(() => 
                    Console.WriteLine(@"Save"), CanExecuteSavePartsCommand));
        }
    }

    public static bool ToggleCanExecuteSavePartsCommand { get; set; }

    private static bool CanExecuteSavePartsCommand()
    {
        return ToggleCanExecuteSavePartsCommand;
    }
}

希望对您有所帮助。