在TextBox中input执行viewmodels命令

当用户在TextBox中按下Enter键时,我想在viewmodel中执行一个命令。 绑定到button时,该命令起作用。

<Button Content="Add" Command="{Binding Path=AddCommand}" /> 

但是我不能从TextBox中使用它。 我尝试了一个Inputbinding,但它没有工作。

 <TextBox.InputBindings> <KeyBinding Command="{Binding Path=AddCommand}" Key="Enter"/> </TextBox.InputBindings> 

我也尝试将工作button设置为默认值,但是在按下Enter键时不会执行。

谢谢你的帮助。

我一直在努力去除这个问题,但接受的答案不能被删除。 请参阅https://stackoverflow.com/a/21110210/114994

我知道我晚了,但是我得到了这个为我工作。 尝试使用Key="Return"而不是Key="Enter"

这是完整的例子

 <TextBox Text="{Binding FieldThatIAmBindingToo, UpdateSourceTrigger=PropertyChanged}"> <TextBox.InputBindings> <KeyBinding Command="{Binding AddCommand}" Key="Return" /> </TextBox.InputBindings> </TextBox> 

确保在你的绑定中使用UpdateSourceTrigger=PropertyChanged ,否则属性将不会被更新,直到焦点丢失,并按下input不会失去焦点…

希望这是有帮助的!

你可能没有把命令作为一个属性,而是一个字段。 它只适用于绑定到属性。 改变你的AddCommand属性,它会工作。 (你的XAML对于我来说可以使用一个属性来代替命令的字段 – >不需要任何代码!)

这里是我为此创build的附加的依赖项属性。 它的优点是确保在命令触发之前将文本绑定更新回ViewModel(对于不支持属性更改源触发器的silverlight有用)。

 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); } }; } } 

你这样使用它:

 <TextBox Text="{Binding Answer, Mode=TwoWay}" my:EnterKeyHelpers.EnterKeyCommand="{Binding SubmitAnswerCommand}"/> 

您需要定义手势而不是KeyBinding的Key属性:

 <TextBox.InputBindings> <KeyBinding Gesture="Enter" Command="{Binding AddCommand}"/> </TextBox.InputBindings> 

除了Mark Heath的回答之外,我通过这种方式实现了Command Parameter的附加属性,进一步上了课。

 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)); public static object GetEnterKeyCommandParam(DependencyObject target) { return (object)target.GetValue(EnterKeyCommandParamProperty); } public static void SetEnterKeyCommandParam(DependencyObject target, object value) { target.SetValue(EnterKeyCommandParamProperty, value); } public static readonly DependencyProperty EnterKeyCommandParamProperty = DependencyProperty.RegisterAttached( "EnterKeyCommandParam", typeof(object), typeof(EnterKeyHelpers), new PropertyMetadata(null)); static void OnEnterKeyCommandChanged(DependencyObject target, DependencyPropertyChangedEventArgs e) { ICommand command = (ICommand)e.NewValue; 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(); } object commandParameter = GetEnterKeyCommandParam(target); command.Execute(commandParameter); } }; } } 

用法:

 <TextBox Text="{Binding Answer, Mode=TwoWay}" my:EnterKeyHelpers.EnterKeyCommand="{Binding SubmitAnswerCommand}" my:EnterKeyHelpers.EnterKeyCommandParam="your parameter"/>