2011-08-04 20 views
7

當在XAML中使用ICommand時,WPF使用CanExecute方法來啓用或禁用與該命令關聯的控件。但是如果我從程序代碼中調用Execute怎麼辦?我應該首先檢查CanExecute以確保該命令可以執行,或者應該Execute負責此檢查嗎?在從程序代碼調用Execute之前,我應該檢查一個ICommand的CanExecute方法嗎?

換句話說,我應該這樣做:

if (someCommand.CanExecute(parameter, target)) 
    someCommand.Execute(parameter, target); 

或者只是這樣的:

someCommand.Execute(parameter, target); 
+0

爲什麼不使這部分Execute()? –

回答

6

良好的風格,將決定了你應該做的是前者,檢查CanExecute第一。這將強制執行適當的分解和一致性。此外,如果您想要使用綁定到按鈕的此命令,它將按預期工作。

+1

合同上,這感覺「更加犀利」。我還補充說,如果你檢查的條件以任何方式依賴於命令的外部狀態(並且因此可以被另一個線程等修改),你會想要鎖定CanExecute/Execute序列。 – JerKimball

3

您應該調用Execute並讓命令實現處理驗證。 CanExecute主要用於UI狀態綁定。

除非是非常簡單的單線程場景,即使您先調用CanExecute,也可能很容易出現競爭條件,CanExecute和Execute調用之間的命令有效性會發生變化,從而使CanExecute調用無意義。

+0

我不明白如何競爭條件會有不同的行爲取決於調用CanExecute然後執行與只是調用執行。這些調用將按順序執行。如果你指的是後臺線程,那麼在執行過程中有一個上下文切換是可能的,因爲在CanExecute和Execute之間有一個切換。 – themaestro

+1

正如你剛纔指出的那樣,它們不一定會按順序執行,即使它們是,什麼是阻止另一個線程在這兩個連續調用之間更改命令的基礎數據或狀態?而命令實現知道它正在操作的上下文,並且可以在需要時自動同步對共享數據的訪問。它也是判斷命令在執行時是否有效的最佳選擇。 –

+0

命令的底層數據可以在執行的任何時候更改,而不考慮是否在Execute調用或CanExecute調用中進行檢查。不過,如果有必要,我會看到同步訪問的情況。然而,我認爲這是少數情況,儘管在一個容易出現競爭條件的小衆中是必要的,但在一般設計中,使用CanExectue會更好。 – themaestro

2

您需要先調用CanExecute,沒有任何說實現ICommand的類在其Execute方法中檢查其CanExecute。

相關問題