2014-01-06 34 views
2

我目前正在重構我的程序以使用MVVM。我已經嘗試過2天使用命令,但我根本無法找到使用它們的好方法。
快捷方式只能用於RoutedCommands和RoutedUICommands,CanExecute和Executed事件處理程序必須在代碼隱藏文件中定義以訪問ui-elements,這會降低可重用性。
如果命令是在視圖模型中定義的,則不能訪問ui-elements。
2的例子來說明我在說什麼在這裏:
如何使用RoutedUICommand?

  1. 我有一個DataGrid的項目清單。在執行DataGrid上的雙擊時,應該在另一個窗口中打開所選項目。如何在MouseDoubleClick事件中調用命令?
  2. 組合框包含值列表。一個按鈕打開一個新的窗口,添加一些東西到這個列表中。窗口關閉後,應該選擇新值。
    我認爲應該使用CommandTarget屬性,但RoutedUICommands可能如何實現?

回答

0

因爲期望的答案不能用的問題給予我會回答它自己。
我正在使用命令作爲我的viewmodel的靜態屬性,這是一種不好的方法。切換到普通屬性後,一切都像魅力!

4

這聽起來像我需要使用RelayCommand或類似的。這是一個類擴展了ICommand接口和而不是RoutedCommand ...您可以將其視爲delegate命令。除了爲每個命令定義一個單獨的類外,您可以簡單地定義內聯處理程序的命令邏輯canExecute處理程序。下面是一個簡單的例子:

public ICommand SaveCommand 
{ 
    get { return new RelayCommand(execute => Save(), canExecute => CanSave()); } 
} 

你可以找到它在RelayCommand.cs頁面在GitHub上的執行和它在Commands, RelayCommands and EventToCommand頁面上MDSN雜誌的描述。

最後,您可以設置鍵盤快捷鍵使用KeyBinding類以下命令:

<KeyBinding Gesture="CTRL+S" Command="{Binding Save, Mode=OneWay}" />