2010-08-05 26 views
48

Tôi muốn thực thi lệnh trong chế độ xem của mình khi người dùng nhấn enter trong Hộp văn bản. Lệnh hoạt động khi được liên kết với một nút.Thực hiện lệnh chế độ xem mô hình khi nhập trong TextBox

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

Nhưng tôi không thể đưa nó hoạt động từ Hộp văn bản. Tôi đã thử một Inputbinding, nhưng nó không hoạt động.

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

Tôi cũng đã cố gắng đặt nút làm việc như mặc định nhưng không được thực thi khi nhấn enter.

Cảm ơn sự giúp đỡ của bạn.

+1

có bạn hãy thay đổi câu trả lời được chấp nhận? Tôi không thể xóa của tôi trong khi nó được chấp nhận. – Jay

Trả lời

0

Tôi đã cố gắng nhiều năm để xóa điều này nhưng không thể xóa câu trả lời được chấp nhận. Xem https://stackoverflow.com/a/21110210/114994.

+5

Nếu chúng ta cần phải viết mã trong mã-đằng sau lý do tại sao không chỉ trực tiếp gọi lệnh trong sự kiện KeyDown? – thewpfguy

+1

Bởi vì với phương pháp này bạn vẫn có thể liên kết với ViewModel của bạn – Wouter

+4

Đây là một ví dụ tốt về cách mở rộng chức năng khi nó không có sẵn thông qua XAML và nó hoạt động. Nhưng câu trả lời đúng cho câu hỏi này là câu hỏi @mkamioner đã cung cấp. –

5

Đây là thuộc tính phụ thuộc đính kèm mà tôi đã tạo cho việc này. Nó có lợi thế là đảm bảo rằng ràng buộc văn bản của bạn được cập nhật trở lại ViewModel trước khi lệnh cháy (hữu ích cho Silverlight không hỗ trợ thuộc tính thay đổi kích hoạt nguồn kích hoạt).

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

Bạn sử dụng nó như thế này:

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

Bạn có thể đã không được thực hiện các lệnh một bất động sản, nhưng một lĩnh vực. Nó chỉ hoạt động để liên kết với các thuộc tính. Thay đổi AddCommand của bạn thành một thuộc tính và nó sẽ hoạt động. (XAML của bạn làm việc tốt cho tôi với một tài sản thay vì một lĩnh vực cho lệnh -> không cần bất kỳ mã nào phía sau!)

+2

Đồng ý. '' làm việc tuyệt vời cho tôi quá! –

123

Tôi biết tôi đến muộn, nhưng tôi đã làm việc này cho tôi. Hãy thử sử dụng Key="Return" thay vì Key="Enter"

Dưới đây là toàn bộ ví dụ

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

Hãy chắc chắn để sử dụng UpdateSourceTrigger=PropertyChanged trong ràng buộc của bạn, nếu không tài sản sẽ không được cập nhật cho đến khi focus sẽ bị mất, và nhấn Enter sẽ không bị mất tập trung ...

Hy vọng điều này hữu ích!

+22

Nó phải được chấp nhận như là giải pháp thay vì chấp nhận câu trả lời với khủng khiếp 'RegisterAttached' – monstr

2

Bạn cần phải xác định Gesture thay vì tài sản chính của keybinding:

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

Ngoài Mark Heath 's câu trả lời, tôi lấy lớp thêm một bước nữa bằng cách thực hiện lệnh Thông số tài sản gắn liền theo cách này;

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

Cách sử dụng:

<TextBox Text="{Binding Answer, Mode=TwoWay}" 
    my:EnterKeyHelpers.EnterKeyCommand="{Binding SubmitAnswerCommand}" 
    my:EnterKeyHelpers.EnterKeyCommandParam="your parameter"/> 
Các vấn đề liên quan