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
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>
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}" />
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>
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ó;
- 1. Chọn nút trong khi nhấn nút enter
- 2. Có nhiều lệnh khi nhấn nút
- 3. javascript nhấn phím enter
- 4. Gửi biểu mẫu khi nhấn enter trong Textarea
- 5. Tạm dừng thực thi Javascript cho đến khi nhấn
- 6. Gọi hàm khi người dùng nhấn enter trong NSSearchField?
- 7. Phải nhấn enter với nohup
- 8. KeyListener trong Textfield không kích hoạt khi nhấn enter
- 9. Nút mặc định trong JFrame không kích hoạt khi phím enter đang được nhấn
- 10. Phát hiện khi người dùng nhấn enter trong Java
- 11. android set hidden keybord khi nhấn enter (trong EditText)
- 12. PuTTY gửi gì khi tôi nhấn phím Enter?
- 13. Cách phát hiện khi người dùng nhấn Enter trong trường nhập
- 14. WPF Binding: giá trị
- 15. Thực hiện nút JDialog phản hồi phím Enter
- 16. Tìm kiếm việc thực thi cây hậu tố trong C#?
- 17. Xác thực đầu vào theo yêu cầu chỉ khi nhấn một nút lệnh nhất định
- 18. WPF: Hộp văn bản có sự kiện kích hoạt khi phím Enter được nhấn
- 19. Gửi giá trị khi nhấn Enter trong vùng văn bản và nhấn Shift + Enter phải đi tới dòng tiếp theo
- 20. Thực hiện lệnh chế độ xem mô hình khi nhập trong TextBox
- 21. Gọi một nút cụ thể trên sự kiện Click khi phím enter được nhấn C#
- 22. Thực hiện tìm kiếm trong Asp.net MVC
- 23. WPF Image Command Binding
- 24. JSF 2.0: yêu cầu ajax khi nhấn ENTER
- 25. DataTrigger Binding trong WPF Style
- 26. thực hiện nút gửi phản hồi để nhấn enter và nhấp vào
- 27. Nhấn Enter để tiếp tục trong C
- 28. Nhấn Enter Luôn gửi biểu mẫu
- 29. Tránh chuyển sang bản ghi tiếp theo khi nhấn Enter?
- 30. TabItem Binding WPF
Cảm ơn, dễ dàng và sạch sẽ. Hoạt động tuyệt vời! –
Cảm ơn bạn vì điều này! – abramlimpin
Nếu bạn không có nút thì sao? – ihake