2009-09-23 51 views
10

我正在使用CAL/Prism構建複合應用程序。主要區域是一個選項卡控件,其中包含多種類型的視圖。每個視圖都有一個自定義設置命令,它可以處理哪些命令綁定到窗口頂部的工具欄按鈕。我之前在非CAL應用程序中完成了此操作,只需在命令中設置InputBinding即可,但我無法在CAL模塊的源代碼中找到任何此類機制。如何將按鍵與Composite WPF中的DelegateCommand相關聯?

我的問題是,什麼是掛鉤擊鍵我認爲最好的方式,這樣當用戶按下Alt鍵+牛逼,相關DelegateCommand對象處理它?連接快捷方式並不困難...

+0

J,我在Silverlight中找不到Freezable,我錯過了什麼? – kenny 2010-09-16 12:59:51

回答

14

MVVM Toolkit有一個名爲CommandReference的類,它允許您使用對命令的引用作爲鍵綁定。

<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> 

這會做到這一點。

編輯:由於是這樣寫的,所以WPF 4.0修復了這個特殊問題,您不再需要使用靜態資源解決方法。您可以直接從KeyBinding中引用viewmodel中的命令。

+0

完美!我花了更多的時間來找到CommandReference類,而不是它掛鉤它。我從字面上看,鍵綁定在兩分鐘內就可以工作。萬分感謝。 – JMcDaniel 2009-09-24 13:42:58

+0

我認爲這兩個答案應該合併,完整的答案實際上都是(這和JMcDaniel的)。一個是不完整的沒有另一個。我需要解決這個問題。謝謝! – bluediapente 2011-06-02 13:39:21

17

僅供參考,類目前未包含在您可以引用但是包含在M-V-VM項目模板中的程序集中。所以如果你不從模板構建你的應用程序,那麼你必須從其他地方獲得該類。我選擇從示例項目中複製它。我將它列入下面,讓每個人都可以輕鬆訪問這一小塊優點,但請務必在未來版本的M-V-VM Toolkit中檢查模板的更新。

/// <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 
} 

享受!

+1

嘿謝謝,這對於下一個人來說會很好。 – 2009-09-24 14:11:23

+0

感謝您發佈代碼!似乎我是「下一個人」,一直在尋找代碼... :) – gehho 2010-07-07 15:01:48

+0

我在Silverlight中找不到Freezable,我錯過了什麼? – kenny 2010-09-16 12:50:28

0

看看這些文章:http://coderscouch.com/tags/input%20bindings。他們應該是有幫助的。

+1

請看看這個:http://stackoverflow.com/questions/how-to-answer請不要把鏈接作爲答案。解釋如何解決問題。 – 2013-04-10 03:47:48

+0

鏈接被破壞,... – ergohack 2017-05-24 22:51:25

相關問題