在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"/>