2009-12-15 23 views
6

我正在研究一個WPF應用程序,並且我非常瞭解命令模式,但是我發現有幾種不同的MVVM命令模式實現。在他的WPF示例應用程序中,有Josh Smith的實現,Prism的DelegateCommandCommandBindings實現。MVVM中WPF指令的接受模式是什麼?

我的問題是,在MVVM中使用命令的最佳做法是什麼?我的應用程序使用棱鏡,因此我們可以使用DelegateCommand

我的團隊的開發人員正在爭論哪種方法是「最好的」。有些人不喜歡爲每個命令生成衆多的.cs文件,而另一些人則喜歡通過CommandBindings連接所有東西。我很茫然。任何人都可以點亮一下嗎?

回答

2

兩點考慮:

由不同MVVM框架,如CommandSinkCommand或SimpleCommand(從束帶)所提供的命令等工作正常個ICommand做。特別是,只要WPF認爲發生了可能導致UI更改的事情,就會對CanExecute處理程序進行評估。您也可以手動強制通過CommandManager.InvalidateRequerySuggested()

與此相反,Prism的DelegateCommands <>不會調用CanExecute處理程序,除非您手動在命令上調用RaiseCanExecuteChanged()。如果你想改變這種做法,它也被炒魷魚時,命令通常重新查詢,查看代碼在http://compositewpf.codeplex.com/Thread/View.aspx?ThreadId=47338

編輯:

觀點二:MVVM框架的命令通常接受一個對象作爲命令參數。相比之下,Prism的DelegateCommands <>更強類型(儘管如果你願意的話你可以有一個DelegateCommands)。

+0

由於出色的第二段,我將接受的答案轉換爲您的答案。感謝您的輸入! –

+0

也檢出MVVMLights RelayCommand,它非常類似於委託命令。 – Agies

3

嗯 - 我認爲解決方案沒有。

CommandBindings不容易測試,並且在ViewModel中引入對WPF類的依賴關係,這不太好。 所以我不會使用它們。

DelegateCommand和CommandSinkCommand(Josh Smith的解決方案)都是IMO的好方法。他們並沒有真正的不同,他們沒有一個優於另一個。 雖然,我注意到CommandSink版本在命令路由變得更復雜時(特別是涉及DataTemplates時)並不總是有效。

你甚至可以合併它們:使用DelegateCommand並另外使用JoshSmith版本 - 因此你可以結合兩者的優點。 你唯一需要的是一些助手類 - 不是很難實現。

更重要的是你的應用程序中的consistency:如果你決定要使用什麼,你應該按照這種方式貫穿整個應用程序。