2010-08-05 69 views
48

我想在用戶按下文本框中的Enter時在我的viewmodel中執行命令。 該命令在綁定到按鈕時起作用。在文本框中輸入時執行viewmodels命令

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

但我不能從TextBox中使它工作。 我試過一個Inputbinding,但它沒有工作。

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

我也嘗試將工作按鈕設置爲默認值,但是當按下enter按鈕時它不會被執行。

感謝您的幫助。

+1

請你改變公認的答案?接受時我不能刪除我的。 – Jay 2015-09-03 16:35:35

回答

0

我一直試圖解決這個問題,但接受的答案無法刪除。請參閱https://stackoverflow.com/a/21110210/114994

+5

如果我們需要在代碼隱藏中編寫代碼,爲什麼不直接在KeyDown事件中直接調用該命令? – thewpfguy 2012-06-01 07:23:52

+1

因爲使用這種方法,您仍然可以綁定到您的ViewModel – Wouter 2012-10-01 09:15:52

+4

這是一個很好的示例,說明如何通過XAML無法擴展功能,並且它可以工作。但是這個問題的正確答案是@mkamioner提供的。 – 2015-05-06 18:14:26

5

這是我爲此創建的附加依賴項屬性。它具有確保在命令觸發前將文本綁定更新回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}"/> 
13

你可能沒有作出命令的屬性,但一個字段。它只適用於綁定到屬性。將您的AddCommand更改爲屬性,它將起作用。 (你的XAML對於我來說可以用屬性代替命令的字段 - >不需要任何代碼!)

+2

同意。 ''也非常適合我! – 2012-02-13 15:52:39

123

我知道我遲到了,但我得到了這個爲我工作。嘗試使用Key="Return"代替Key="Enter"

下面是完整的例子

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

請確保您要使用的綁定UpdateSourceTrigger=PropertyChanged,否則財產將不會被更新,直到丟失焦點,並按下Enter鍵不會失去焦點...

希望這有幫助!

+22

它必須被接受爲解決方案,而不是接受可怕的'RegisterAttached' – monstr 2014-07-04 07:41:48

2

您需要定義的,而不是鍵綁定的關鍵特性手勢:

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

除了Mark Heath的答案,我把類一步通過實施這樣命令參數附加屬性;

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"/> 
相關問題