2012-03-01 41 views
3

我想學習如何使用WPF命令,以及它們如何適合MVVM模式。我知道某些控件(如按鈕或菜單)具有一個Command屬性,該屬性在設置爲ICommand類的實例時將按鈕連接到該命令。一旦設置完成,該按鈕就會通過命令的CanExecuteChanged事件關閉並啓用,然後單擊該控件將調用該命令的Execute方法。ICommands如何以及在哪裏適合整體WPF MVVM模式?

但是,每個ICommand的實例應該在哪裏生活?我在教程中看到了各種不同的選項,我不確定哪個是正確的。在一些示例中,創建一個靜態的「ApplicationCommands」類,並將每個命令的一個實例分配給該類的靜態屬性。在其他例子中,我已經看到命令設置爲ViewModel的屬性,在其他視圖/窗口本身。命令實例的首選位置是什麼?

此外,命令如何與視圖,視圖模型或模型關聯?命令應該知道和/或操縱哪些組件?命令執行時會發生什麼?是否應該調用模型的某些方法,然後將變化傳回View Model/View?還是應該通過視圖模型的方法與模型通信?

回答

1

靜態命令的方法通常採用RoutedCommands或具有廣泛的應用程序,不耦合到任何特定對象的狀態的命令。如果您使用ICommand的動態實現,它們將在構造函數中傳遞給它們的方法傳遞給它們,它們通常是該命令相關的ViewModel的實例。

這些命令可以對ViewModel和Model起作用,你如何做到這一點取決於你,我經常從命令的Execute調用VM上的相應方法來保持命令初始化代碼的簡潔。

我真的不能告訴你什麼是最好的方法,也許別人有更多的洞察什麼時候以及爲什麼最好。

1

在一些例子中靜態「ApplicationCommands」類創建並在每個命令的實例分配給該類

您爲您希望能夠命令做到這一點的靜態屬性。從任何地方訪問。例如,如果你想要一個F1的鍵排序總是顯示幫助屏幕,那麼你可以在一個全局可訪問的點上執行該命令,然後從各個屏幕綁定到該鍵。

將所看到的命令設置爲ViewModel的屬性,以及其他視圖/窗口本身。

如果該命令對數據做了某些事情,那麼ViewModel是一個很好的選擇。如果該命令不需要對數據執行任何操作,那麼將其放入View的代碼中(因爲它與ViewModel無關,並且不需要使用它來污染ViewModel)。一個有趣的例子是,當你正在做一些響應按鍵彈出對話框的事情時,你需要將當前選中的網格項傳遞給對話框 - 命令應該放在哪裏?在這種情況下,我會將它放在視圖後面的代碼中,因爲沒有強制性的理由將其放入ViewModel中 - 如果需要,可以通過視圖從ViewModel中檢索選定的項目。

很多時候,我看到命令不必要地放入ViewModel中,僅僅是因爲人們認爲這是唯一的方法。我使用的經驗法則是:如果它正在做與UI相關的工作,那麼它就屬於視圖背後的代碼。如果它正在做數據相關的工作,那麼它可以進入ViewModel。如果它正在做一個混合,然後考慮分解View和ViewModel的功能。

這些組件中的哪些應該知道和/或操作該命令?

只有它需要知道的。從ViewModel訪問模型等組件應該通過正確定義的屬性或返回接口的函數來完成,這是爲了避免緊密耦合。

它是否應該調用Model的某個方法,然後將更改傳回View Model/View?

從ViewModel訪問模型的命令沒有問題。該命令可以更新ViewModel或Model上的屬性,並通過數據綁定和屬性通知的魔力,這些更新可以反映回用戶界面。

相關問題