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 这样的非可视元素是等效的。
在这种情况下,最简单的方法是在 MoveTestUpCommand
、MoveTestDownCommand
和 RemoveTestCommand
中实施 CanExecute()
方法。当您不希望用户能够执行这些操作时,此方法应该 return false
。因此,您的 KeyBinding
s 将无效,因为命令不会被执行。
如果您的按钮的 Command
属性也绑定到这些命令,这些按钮将根据 CanExecute()
自动更新它们的可用性 (IsEnabled
属性) return 值。要从视图模型更新视图状态,只需在相应命令上调用 RaiseCanExecuteChanged()
方法(但这取决于您的 ICommand
实现)。
要根据按钮的可用性设置按钮的可见性,您可以使用如下内容:
<Button
Command = "{Binding SampleCommand}"
Visibility = "{Binding IsEnabled, RelativeSource = {RelativeSource Self}, Converter = {StaticResource BooleanToVisibilityConverter}}"/>
System.Windows.Controls
中有 BooleanToVisibilityConverter
的实现。
我有一个带有一些 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 这样的非可视元素是等效的。
在这种情况下,最简单的方法是在 MoveTestUpCommand
、MoveTestDownCommand
和 RemoveTestCommand
中实施 CanExecute()
方法。当您不希望用户能够执行这些操作时,此方法应该 return false
。因此,您的 KeyBinding
s 将无效,因为命令不会被执行。
如果您的按钮的 Command
属性也绑定到这些命令,这些按钮将根据 CanExecute()
自动更新它们的可用性 (IsEnabled
属性) return 值。要从视图模型更新视图状态,只需在相应命令上调用 RaiseCanExecuteChanged()
方法(但这取决于您的 ICommand
实现)。
要根据按钮的可用性设置按钮的可见性,您可以使用如下内容:
<Button
Command = "{Binding SampleCommand}"
Visibility = "{Binding IsEnabled, RelativeSource = {RelativeSource Self}, Converter = {StaticResource BooleanToVisibilityConverter}}"/>
System.Windows.Controls
中有 BooleanToVisibilityConverter
的实现。