我的WPF应用中有一个搜索字段,其中包含一个包含命令绑定的搜索按钮。这很好用,但是当按下键盘上的Enter键时,如何对文本字段使用相同的命令绑定?我见过的例子都是使用KeyDown事件处理程序后面的代码。有没有一种聪明的方法可以使用xaml和命令绑定来完成这项工作?
答案 0 :(得分:24)
您可以使用按钮的IsDefault属性:
<Button Command="SearchCommand" IsDefault="{Binding ElementName=SearchTextBox,
Path=IsKeyboardFocused}">
Search!
</Button>
答案 1 :(得分:23)
只有在您已经有一个绑定到该命令的按钮时,才能使用已接受的答案。
要避免此限制,请使用TextBox.InputBindings:
<TextBox.InputBindings>
<KeyBinding Key="Enter" Command="{Binding Path=MyCommand}"></KeyBinding>
</TextBox.InputBindings>
答案 2 :(得分:3)
Prism参考实施包含了您所追求的实现。
基本步骤如下:
这使您可以使用如下行为:
<TextBox prefix:EnterKey.Command="{Binding Path=SearchCommand}" />
答案 3 :(得分:1)
<TextBox Text="{Binding SerachString, UpdateSourceTrigger=PropertyChanged}">
<TextBox.InputBindings>
<KeyBinding Command="{Binding SearchCommand}" Key="Enter" />
</TextBox.InputBindings>
</TextBox>
这应该可以正常工作。100%
答案 4 :(得分:0)
我已经尝试过Greg Samson的TextBox.Inputs解决方案,但是收到一个错误,说我只能通过依赖属性绑定到textinputs。 最后,我找到了下一个解决方案。
创建一个名为CommandReference的类,如下所示:
public class CommandReference : Freezable, ICommand
{
public CommandReference()
{
//
}
public static readonly DependencyProperty CommandProperty = DependencyProperty.Register("Command", typeof(ICommand), typeof(CommandReference), new PropertyMetadata(new PropertyChangedCallback(OnCommandChanged)));
public ICommand Command
{
get { return (ICommand)GetValue(CommandProperty); }
set { SetValue(CommandProperty, value); }
}
#region ICommand Members
public bool CanExecute(object parameter)
{
if (Command != null)
return Command.CanExecute(parameter);
return false;
}
public void Execute(object parameter)
{
Command.Execute(parameter);
}
public event EventHandler CanExecuteChanged;
private static void OnCommandChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
CommandReference commandReference = d as CommandReference;
ICommand oldCommand = e.OldValue as ICommand;
ICommand newCommand = e.NewValue as ICommand;
if (oldCommand != null)
{
oldCommand.CanExecuteChanged -= commandReference.CanExecuteChanged;
}
if (newCommand != null)
{
newCommand.CanExecuteChanged += commandReference.CanExecuteChanged;
}
}
#endregion
#region Freezable
protected override Freezable CreateInstanceCore()
{
throw new NotImplementedException();
}
#endregion
}
在Xaml中将此添加到UserControl资源:
<UserControl.Resources>
<Base:CommandReference x:Key="SearchCommandRef" Command="{Binding Path = SomeCommand}"/>
实际的TextBox如下所示:
<TextBox Text="{Binding Path=SomeText}">
<TextBox.InputBindings>
<KeyBinding Command="{StaticResource SearchCommandRef}" Key="Enter"/>
</TextBox.InputBindings>
</TextBox>
我不记得从哪里获得此代码,但此网站也解释了它;