2009-09-23 41 views
10

Tôi đang xây dựng một ứng dụng tổng hợp bằng CAL/Prism. Vùng chính là một điều khiển tab, với nhiều loại chế độ xem trong đó. Mỗi khung nhìn có một lệnh tùy chỉnh mà nó có thể xử lý được gắn vào các nút trên thanh công cụ ở phía trên cùng của cửa sổ. Tôi đã làm điều này trước khi trong các ứng dụng không phải CAL bằng cách đơn giản thiết lập InputBinding trên lệnh, nhưng tôi đã không thể tìm thấy bất kỳ cơ chế như vậy trong mã nguồn cho các mô-đun CAL.Làm cách nào để kết hợp phím bấm với DelegateCommand trong Composite WPF?

Câu hỏi của tôi là, cách tốt nhất để treo lên một phím tắt để quan điểm của tôi là gì, để khi người dùng nhấn Alt +T, đối tượng DelegateCommand liên quan xử lý nó? Hooking lên một phím tắt có thể không được khó khăn ...

+0

J, tôi không thể tìm thấy Freezable trong Silverlight, tôi thiếu gì? – kenny

Trả lời

14

MVVM Toolkit có một lớp được gọi là CommandReference sẽ cho phép bạn sử dụng tham chiếu đến lệnh làm khóa liên kết.

<Window ... 
    xmlns:toolkit="clr-namespace:CannotRememberNamspace;assembly=OrTheAssembly" 
    > 

    <Window.Resources> 
     <toolkit:CommandReference 
       x:Key="ExitCommandReference" 
       Command="{Binding ExitCommand}" /> 
    </Window.Resources> 

    <Window.InputBindings> 
     <KeyBinding Key="X" 
        Modifiers="Control" 
        Command="{StaticResource ExitCommandReference}" /> 
    </Window.InputBindings> 
</Window> 

Điều này sẽ thực hiện.

Chỉnh sửa: Vì điều này được viết, WPF 4.0 đã khắc phục sự cố cụ thể này và bạn không còn phải sử dụng giải pháp tài nguyên tĩnh nữa. Bạn có thể tham khảo lệnh trong viewmodel của bạn trực tiếp từ KeyBinding.

+0

Hoàn hảo! Nó đã cho tôi nhiều thời gian hơn để tìm lớp CommandReference hơn là để móc nó vào. Tôi thực sự đã có các ràng buộc chính làm việc trong hai phút. Cảm ơn một tấn. – JMcDaniel

+0

Tôi nghĩ cả hai câu trả lời nên được hợp nhất, câu trả lời đầy đủ thực sự là cả hai (điều này và của JMcDaniel). Một là hoàn toàn không có người khác. Tôi cần cả hai để giải quyết vấn đề. Cảm ơn! – bluediapente

17

Chỉ để tham khảo, lớp CommandReference hiện không được bao gồm trong một hội đồng mà bạn có thể tham chiếu, nhưng được bao gồm trong mẫu dự án M-V-VM. Vì vậy, nếu bạn không xây dựng ứng dụng của bạn từ các mẫu, sau đó bạn có để có được các lớp học từ một nơi khác. Tôi đã chọn để sao chép nó từ dự án mẫu. Tôi đã đưa nó vào bên dưới để cho phép mọi người dễ dàng truy cập vào phần nhỏ này của lòng tốt, nhưng hãy chắc chắn kiểm tra các bản cập nhật cho mẫu trong các phiên bản tương lai của Bộ công cụ M-V-VM.

/// <summary> 
/// This class facilitates associating a key binding in XAML markup to a command 
/// defined in a View Model by exposing a Command dependency property. 
/// The class derives from Freezable to work around a limitation in WPF when data-binding from XAML. 
/// </summary> 
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; 
     if (commandReference != null) 
     { 
      ICommand oldCommand = e.OldValue as ICommand; 
      if (oldCommand != null) 
       oldCommand.CanExecuteChanged -= commandReference.CanExecuteChanged; 

      ICommand newCommand = e.NewValue as ICommand; 
      if (newCommand != null) 
       newCommand.CanExecuteChanged += commandReference.CanExecuteChanged; 
     } 
    } 

    #endregion 

    #region Freezable 

    protected override Freezable CreateInstanceCore() 
    { 
     return new CommandReference(); 
    } 

    #endregion 
} 

Tận hưởng!

+1

Xin cảm ơn, điều đó sẽ tốt đẹp cho anh chàng tiếp theo đến cùng. –

+0

Cảm ơn bạn đã đăng mã! Có vẻ như tôi là "anh chàng tiếp theo" đi cùng, tìm kiếm mã đó ... :) – gehho

+0

Tôi không thể tìm thấy Freezable trong Silverlight, tôi đang thiếu gì? – kenny

0

xem các bài viết sau: http://coderscouch.com/tags/input%20bindings. Chúng sẽ hữu ích.

+1

Hãy xem điều này: http://stackoverflow.com/questions/how-to-answer Vui lòng không đặt liên kết làm câu trả lời. Giải thích cách giải quyết vấn đề. –

+0

Liên kết bị hỏng, ... – ergohack

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