禁用MVVM中的键绑定

时间:2015-05-13 20:13:47

标签: c# wpf mvvm key-bindings

我的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无法识别,如果我在我的Code-Behind中定义,我不知道如何将该静态命令链接到我的实际MVVM模型。

2 个答案:

答案 0 :(得分:1)

我看到你已经解决了它。好。

但是,使用任何代码隐藏代码的一种方法是从视图模型中修改静态命令的CanExecute逻辑。

假设您有一个MainWindow,它的数据上下文为MainViewModel,您的菜单相关命令位于静态Commands类中。然后考虑以下针对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;
    }
}

希望它有所帮助。

答案 1 :(得分:0)

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

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