WPF DataTrigger 可以停用 KeyBinding 吗?

Can a WPF DataTrigger Deactivate a KeyBinding?

我有一个带有一些 KeyBinding 的 ListView,可以让用户使用键盘快捷键移动和删除条目。但是,我不希望绑定一直都可以访问。

用于添加、删除和移动条目的按钮控件的可见性与 ComboBox 的选择相关(只有某些用户可以编辑)。我也希望键盘快捷键根据框选择停用。

我还没有找到任何关于这是否可行的信息。大家怎么看?

<ComboBox x:Name="TesterIdentityBox" ItemsSource="{Binding Path=TesterIdentityList, UpdateSourceTrigger=PropertyChanged}" DisplayMemberPath="Name" SelectedItem="{Binding Path=TesterIdentitySelection, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"  SelectedIndex="{Binding TesterIdentityIndex, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

<ListView ItemsSource="{Binding TestViewList, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" SelectedIndex="{Binding SelectedTestIndex, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" SelectedItem="{Binding Path=SelectedTest}">
    <ListView.InputBindings>
        <KeyBinding Key="Up" Command="{Binding Path=MoveTestUpCommand}" CommandParameter="{Binding Path=SelectedTest.Description}" />
        <KeyBinding Key="Down" Command="{Binding Path=MoveTestDownCommand}" CommandParameter="{Binding Path=SelectedTest.Description}" />
        <KeyBinding Key="Delete" Command="{Binding Path=RemoveTestCommand}" />
    </ListView.InputBindings>

我使用 Style Setters 和 DataTriggers 来改变命令按钮的可见性,但我不知道什么(如果有的话)对于像 KeyBinding 这样的非可视元素是等效的。

在这种情况下,最简单的方法是在 MoveTestUpCommandMoveTestDownCommandRemoveTestCommand 中实施 CanExecute() 方法。当您不希望用户能够执行这些操作时,此方法应该 return false。因此,您的 KeyBindings 将无效,因为命令不会被执行。

如果您的按钮的 Command 属性也绑定到这些命令,这些按钮将根据 CanExecute() 自动更新它们的可用性 (IsEnabled 属性) return 值。要从视图模型更新视图状态,只需在相应命令上调用 RaiseCanExecuteChanged() 方法(但这取决于您的 ICommand 实现)。

要根据按钮的可用性设置按钮的可见性,您可以使用如下内容:

<Button 
  Command = "{Binding SampleCommand}" 
  Visibility = "{Binding IsEnabled, RelativeSource = {RelativeSource Self}, Converter = {StaticResource BooleanToVisibilityConverter}}"/>

System.Windows.Controls 中有 BooleanToVisibilityConverter 的实现。