WPF:按下enter按钮时在搜索字段中执行命令绑定

时间:2009-10-19 08:42:14

标签: c# wpf xaml commandbinding

我的WPF应用中有一个搜索字段,其中包含一个包含命令绑定的搜索按钮。这很好用,但是当按下键盘上的Enter键时,如何对文本字段使用相同的命令绑定?我见过的例子都是使用KeyDown事件处理程序后面的代码。有没有一种聪明的方法可以使用xaml和命令绑定来完成这项工作?

5 个答案:

答案 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参考实施包含了您所追求的实现。

基本步骤如下:

  • 创建一个静态类EnterKey
  • 在EnterKey上注册了ICommand类型的附加属性“Command”
  • 在EnterKey上输入类型为EnterKeyCommandBehavior的附加属性“EnterKeyCommandBehavior”
  • 当“Command”的值发生更改时,将“EnterKeyCommandBehavior”作为EnterKeyCommandBehavior的新实例附加到控件,并将ICommand分配给行为的Command属性。
    • 如果已附加行为,请使用现有实例
  • EnterKeyCommandBehavior在构造函数中接受UIElement并附加到PreviewKeyDown(如果您希望保持Silverlight兼容,则附加到KeyDown)。
  • 在事件处理程序中,如果键为Enter,则执行ICommand(如果CanExecute为true)。

这使您可以使用如下行为:

<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>

我不记得从哪里获得此代码,但此网站也解释了它;

http://www.netframeworkdev.com/windows-presentation-foundation-wpf/invoke-a-command-with-enter-key-after-typing-in-a-textbox-21909.shtml