我的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模型。
答案 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)));