2011-11-29 111 views
0

我希望在我的ViewModel中接收命令(即根本沒有任何代碼)。我在視圖中設置了KeyBindings,但我不確定如何在視圖模型上構建命令,我該如何操作?我已經嘗試了下面的代碼,但它永遠不會被調用。WPF中的鍵盤快捷鍵路由到ViewModel

我收到此錯誤在輸出窗口

BindingExpression path error: 'ShowHelp' property not found on 'object' ''String' (HashCode=-1833871577)'. BindingExpression:Path=ShowHelp; DataItem='String' (HashCode=-1833871577); target element is 'KeyBinding' (HashCode=60325168); target property is 'Command' (type 'ICommand')

視圖模型被像這樣定義:(注意,這適用於窗口中的所有其他綁定)

<app:ViewModel x:Key="viewModel"></app:ViewModel> 

XAML:

<Window.InputBindings> 
    <KeyBinding Command="{Binding ShowHelp, Source=viewModel}" Gesture="ALT+H" /> 
</Window.InputBindings> 

視圖模型代碼

這是我已經開始與視圖模型代碼來執行命令,如果這是錯誤的請指教:)

public class ShowHelpCommand : ICommand 
{ 
    public bool CanExecute(object parameter) 
    { 
     return true; 
    } 

    public event EventHandler CanExecuteChanged; 

    public void Execute(object parameter) 
    { 
     Console.WriteLine("SHOW HELP"); 
    } 
} 
public ICommand ShowHelp { get; set; } 
ShowHelp = new ShowHelpCommand(); 

回答

1

是不是缺少StaticResource?

<KeyBinding Command="{Binding ShowHelp, Source={StaticResource viewModel}}" Gesture="ALT+H" /> 
+0

是的Erik,是的 - 謝謝! – Chris

+0

在'object''String'上找不到''ShowHelp'屬性的錯誤信息在閱讀時很有幫助......;) – erikH

+0

是啊:)我只是不知道該怎麼做才能做到這一點! – Chris

1

最簡單的方法是使用DelegateCommand <牛逼>即在微軟棱鏡庫(http://msdn.microsoft.com/en-us/library/ff653940.aspx

你的代碼,然後將是這個樣子:

ShowHelp = new DelegateCommand<object>(param => MethodToExecute) 
private void MethodToExecute(object param) { 
    //... 
} 

如果您不想在項目中包含Prism庫,那麼很容易推出自己的委託命令實現,您只需實現ICommand接口並傳入並存儲Action和Func並執行它們在Execute和CanExecute的實現中。

+0

嘿謝謝你的回答,我不想使用棱鏡。我更新了我的答案,以顯示我的ICommand實現,但它仍然不起作用,我相信命令永遠不會被調用 - 任何想法? – Chris

+0

啊,是的,當你編輯你的問題以包含綁定錯誤時更有意義。 –