2011-11-10 26 views
1

似乎大多數MVVM框架使用一個ICommand派生,他們只是向視圖中的Execute/CanExecute方法提供委託,而不是派生一個新的類,重寫Execute/CanExecute方法。WPF/SL - 從ICommand派生或派生到Execute/CanExecute

哪一個是最好的設計?傳遞方法委託或派生提供Execute/CanExecute for ICommand?

似乎派生會在其他視圖中獲得更多的命令的可重用性,並可能更清潔?但是對於小的Execute/CanExecute操作來說,創建一個新的派生類的開銷太大了,只是將delgates傳遞給視圖中的方法更好?

感謝您對最佳實踐的深入瞭解。

回答

2

ICommand接口的主要不便之處在於該命令在另一個類實例中「隱藏」。通常,您希望命令對暴露ICommand屬性的類進行操作。

如Josh Smith所推廣的經典RelayCommand通過提供ExecuteCanExecute方法的lambda表達式來構造。

通過爲您的ICommand方法使用lambda表達式,可以將命令「提升」回到正在執行的類中。另一種方法是在命令類和命令類之間緊密耦合,或者將操作發送回被命令類的轉發方法。

lambda表達式有權訪問構建命令時在範圍內的私有成員。這大大減少了ICommand屬性必須是單獨的類實例的不便。

儘管如此,利用類的公共API來完成其動作的足夠通用的ICommand也可以是有用且可重用的實現模式。