2011-12-01 45 views
0

假設其中一個ViewModel接收一些相當通用的命令(也可以從其他ViewModel執行,例如「stop ftp server」)。我該怎麼辦?如何執行命令?通過單身實用程序方法或通過OnPropertyChanged?

  • 傳播完成OnPropertyChanged事件容器,在一些頂層視圖執行命令(MainWindowViewModel
  • 通過一些「單獨服務層」級到每個ViewModel,直接在ViewModel執行靜態方法,像Utils.StopFtpServer()
  • 其他?
+0

視圖應負責儘可能少的與視圖無關的應用程序邏輯。 FTP服務器與View無關。但我個人不喜歡單身人士,所以我也不會使用這個選項。在你的例子中,我傾向於創建一個具有Stop方法的'FtpServer'類,並將它的一個實例傳遞給所有關注它的視圖模型。我也會通過依賴注入將它傳遞給這些視圖模型,所以我可以在將來替代它的實現。視圖模型如何知道停止是另一個問題,你 - 你能解釋一下嗎? –

+0

目前還不清楚你試圖達到什麼目的。 ViewModel如何接收命令「Stop ftp server」? –

+0

嗯爲什麼View Model會收到這條消息,除非它特別關注它 - 在這種情況下,有人也會聽命令。 –

回答

1

靜態命令由微軟使用。因此,使用定義所有這些全局命令的靜態類是不錯的主意。

爲了給什麼我已經說過一個例子:

EditingCommands.AlignLeft 

這是一個靜態類,它提供用於文本編輯全球命令。

這就是說,我會建議避免將業務邏輯放入命令。將其封裝到Business對象中並從命令中調用這些對象。這樣你就可以分離Gui和Business,並擁有更多可測試的應用程序。

+0

「單身服務層」 - 從未聽說過。你能提供一個鏈接嗎? –

+0

我重複了OP概念的名稱,我用斜體表示它不是這個的正式名稱。我會編輯我的帖子以避免進一步的誤解。 –

0

這兩個去與傳播事件。辛格爾頓是一個不友好的測試結構,你真的不要去測試不友好的功能,比如停止或啓動一些服務。裏面有這樣一個構造。

此答案與MVVM無關。

1

如果你想要做的事情的MVVM方式,那麼你不應該塞進視圖或視圖模型,或靜態方法或辛格爾頓這一點。

FTP服務器應該是一個完整的Model類。

  • 觀應該告訴它要執行StopFtpServerCommand
  • 視圖模型應該告訴FtpServer實例的FTP服務器應該Stop

這意味着你將支持多實例視圖模型的FTP服務器,即使您不會通過UI公開該支持。

如果你走這條路,你會避免自己畫成一個角落在未來,當你決定要多的FTP服務器。它會迫使你爲你的課程寫一個更好的抽象,這樣你會更有可能在未來的程序中重用它。

與編寫單例或靜態方法相比,編寫應用程序也不是很有挑戰性。

如果您需要從多個視圖模型(這似乎你的問題並不需要)訪問同一個實例,這是一個獨立的挑戰。我個人建議使用Dependency Injection這樣的東西來解決這個問題,所以你不要在視圖模型裏面調用new FtpServer()

0
<Button Command="{Binding {x:Static business:MyStaticClass.MyStaticCommand}}" /> 

這樣的事情?假設您擁有MyStaticClass中的邏輯,該邏輯應位於業務層中