2009-10-19 25 views
21

Tôi có một trường tìm kiếm trong ứng dụng WPF của tôi bằng nút tìm kiếm có chứa lệnh ràng buộc. Điều này làm việc tuyệt vời, nhưng làm thế nào tôi có thể sử dụng cùng một lệnh ràng buộc cho trường văn bản khi nhấn enter trên bàn phím? Các ví dụ mà tôi đã thấy là tất cả đều sử dụng Mã phía sau với Trình xử lý sự kiện KeyDown. Có một cách thông minh để làm cho công việc này chỉ với xaml và lệnh ràng buộc?WPF: Thực thi Lệnh Binding trong trường tìm kiếm khi nhấn nút enter

Trả lời

22

Bạn có thể sử dụng thuộc tính IsDefault của nút:

<Button Command="SearchCommand" IsDefault="{Binding ElementName=SearchTextBox, 
               Path=IsKeyboardFocused}"> 
     Search! 
    </Button> 
+0

Cảm ơn, dễ dàng và sạch sẽ. Hoạt động tuyệt vời! –

+0

Cảm ơn bạn vì điều này! – abramlimpin

+0

Nếu bạn không có nút thì sao? – ihake

3

Prism Thực hiện tham chiếu chứa một triển khai chính xác những gì bạn đang làm sau.

Các bước cơ bản là:

  • Tạo một lớp tĩnh EnterKey
  • đăng ký tài sản gắn liền "Command" của loại ICommand trên EnterKey
  • đăng ký tài sản gắn liền "EnterKeyCommandBehavior" của loại EnterKeyCommandBehavior trên EnterKey
  • Khi giá trị của "Command" thay đổi, đính kèm "EnterKeyCommandBehavior" vào điều khiển như một thể hiện mới của EnterKeyCommandBehavior, và gán ICommand cho thuộc tính Command của hành vi.
    • Nếu hành vi này đã được đính kèm, sử dụng các ví dụ hiện
  • EnterKeyCommandBehavior chấp nhận một UIElement trong các nhà xây dựng và gắn vào PreviewKeyDown (hoặc KeyDown nếu bạn muốn ở lại tương thích Silverlight).
  • Trong trình xử lý sự kiện, nếu phím là Enter, hãy thực thi ICommand (nếu CanExecute là true).

này cho phép bạn sử dụng các hành vi như vậy:

<TextBox prefix:EnterKey.Command="{Binding Path=SearchCommand}" /> 
23

Câu trả lời được chấp nhận chỉ hoạt động nếu bạn đã có một nút bị ràng buộc với lệnh.

Để tránh hạn chế này, sử dụng TextBox.InputBindings:

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

Cảm ơn bạn đã cập nhật –

+0

Điều này đã hiệu quả đối với tôi. – Garry

+0

Tôi cũng phải thay đổi UpdateSourceTrigger trên ràng buộc TextBox.Text để làm việc này. Để biết thêm chi tiết, hãy xem [Chụp phím Enter trong một TextBox] (http://stackoverflow.com/a/5556526/744014). – Scott

0

Tôi đã thử các giải pháp TextBox.Inputs của Greg Samson, nhưng có một lỗi nói rằng tôi chỉ có thể liên kết với textinputs thông qua một tài sản phụ thuộc . Cuối cùng tôi đã tìm ra giải pháp tiếp theo cho việc này.

Tạo một lớp được gọi là CommandReference mà trông như thế này:

public class CommandReference : Freezable, ICommand 
{ 
    public CommandReference() 
    { 
     // 
    } 

    public static readonly DependencyProperty CommandProperty = DependencyProperty.Register("Command", typeof(ICommand), typeof(CommandReference), new PropertyMetadata(new PropertyChangedCallback(OnCommandChanged))); 

    public ICommand Command 
    { 
     get { return (ICommand)GetValue(CommandProperty); } 
     set { SetValue(CommandProperty, value); } 
    } 

    #region ICommand Members 

    public bool CanExecute(object parameter) 
    { 
     if (Command != null) 
      return Command.CanExecute(parameter); 
     return false; 
    } 

    public void Execute(object parameter) 
    { 
     Command.Execute(parameter); 
    } 

    public event EventHandler CanExecuteChanged; 

    private static void OnCommandChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     CommandReference commandReference = d as CommandReference; 
     ICommand oldCommand = e.OldValue as ICommand; 
     ICommand newCommand = e.NewValue as ICommand; 

     if (oldCommand != null) 
     { 
      oldCommand.CanExecuteChanged -= commandReference.CanExecuteChanged; 
     } 
     if (newCommand != null) 
     { 
      newCommand.CanExecuteChanged += commandReference.CanExecuteChanged; 
     } 
    } 

    #endregion 

    #region Freezable 

    protected override Freezable CreateInstanceCore() 
    { 
     throw new NotImplementedException(); 
    } 

    #endregion 
} 

Trong XAML thêm video này vào các tài nguyên UserControl:

<UserControl.Resources> 
    <Base:CommandReference x:Key="SearchCommandRef" Command="{Binding Path = SomeCommand}"/> 

Các TextBox thực tế trông như thế này:

<TextBox Text="{Binding Path=SomeText}"> 
        <TextBox.InputBindings> 
         <KeyBinding Command="{StaticResource SearchCommandRef}" Key="Enter"/> 
        </TextBox.InputBindings> 
       </TextBox> 

Tôi không nhớ mình đã lấy mã này từ đâu, nhưng trang này cũng giải thích nó;

http://www.netframeworkdev.com/windows-presentation-foundation-wpf/invoke-a-command-with-enter-key-after-typing-in-a-textbox-21909.shtml

Các vấn đề liên quan