Executing viewmodels command on enter in TextBox
I know I am late to the party, but I got this to work for me. Try using Key="Return"
instead of Key="Enter"
Here is the full example
<TextBox Text="{Binding FieldThatIAmBindingToo, UpdateSourceTrigger=PropertyChanged}"> <TextBox.InputBindings> <KeyBinding Command="{Binding AddCommand}" Key="Return" /> </TextBox.InputBindings></TextBox>
Make sure to use UpdateSourceTrigger=PropertyChanged
in your binding, otherwise the property will not be updated until focus is lost, and pressing enter will not lose focus...
Hope this was helpful!
Here's an attached dependency property I created for this. It has the advantage of ensuring that your text binding is updated back to the ViewModel before the command fires (useful for silverlight which doesn't support the property changed update source trigger).
public static class EnterKeyHelpers{ public static ICommand GetEnterKeyCommand(DependencyObject target) { return (ICommand)target.GetValue(EnterKeyCommandProperty); } public static void SetEnterKeyCommand(DependencyObject target, ICommand value) { target.SetValue(EnterKeyCommandProperty, value); } public static readonly DependencyProperty EnterKeyCommandProperty = DependencyProperty.RegisterAttached( "EnterKeyCommand", typeof(ICommand), typeof(EnterKeyHelpers), new PropertyMetadata(null, OnEnterKeyCommandChanged)); static void OnEnterKeyCommandChanged(DependencyObject target, DependencyPropertyChangedEventArgs e) { ICommand command = (ICommand)e.NewValue; FrameworkElement fe = (FrameworkElement)target; Control control = (Control)target; control.KeyDown += (s, args) => { if (args.Key == Key.Enter) { // make sure the textbox binding updates its source first BindingExpression b = control.GetBindingExpression(TextBox.TextProperty); if (b != null) { b.UpdateSource(); } command.Execute(null); } }; }}
You use it like this:
<TextBox Text="{Binding Answer, Mode=TwoWay}" my:EnterKeyHelpers.EnterKeyCommand="{Binding SubmitAnswerCommand}"/>