在 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;
}
}
希望对您有所帮助。
我的 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;
}
}
希望对您有所帮助。