2013-04-01 106 views
0

先打印,看看this question and answer。在答案中提供的代碼中,沒有調用PrintDialog.Showdialog(),因此此示例使用對話對象快速打印某些內容。印在WPF與MVVM - 從視圖中顯示PrintDialog類,但與視圖模型

然而,PrintDialog本身就是一個視圖,視覺打印是一個視圖,所以我想這一切應該在視圖中去。視圖的數據在ViewModel中,打印的視圖應該由視圖構建,然後發送到打印機(就像視圖將視覺信息觸發到屏幕上一樣)。這是以這種方式來思考MVVM的正確方法嗎?

我想從視圖中顯示PrintDialog類用戶,然後通過對話框到視圖模型用於打印的,但它只是似乎打破MVVM背後的理念。

回答

2

首先,版主通常關閉開放式討論,就像這樣的問題。你應該縮小你的問題,以便能夠明確地回答。

其次,您傳遞的東西,顯然是任何時候「視圖」導向到您的視圖模型,你違反了關注點分離。此外,視圖模型中可阻止單元測試完成執行的任何活動應該是您正在打破MVVM的立即紅旗。在這種情況下,顯示並等待輸入或處於模態狀態的打印對話框會導致單元測試超時或掛起。

的解決辦法是通過服務類在執行打印網格,顯示一個對話框的工作,並要求任何工作,把工作做好。在MVVM中,我們大多數人使用依賴注入(DI)來做到這一點(我使用MEF)。您將使用相同的接口創建另一個服務,以便您的測試使用不會阻止執行的測試。在這種情況下,該服務是一個視圖層服務,並且不應該依賴於視圖模型。視圖模型唯一知道的是它有一個服務接口可以調用,服務只知道視圖模型的是它爲這種交互實現的接口(除非你可以通過它來設置服務上所有需要的數據自己的界面)。

有關進一步的參考,當你認爲你可能會採取錯誤的做法,以OOAD,看SOLID (object-oriented design)。這不是確定性的,但它是出色的指導。

+0

感謝您的迴應,我甚至沒有想過關閉服務類。我可能可以說我的問題更直接,但我不認爲我完全知道我的問題是什麼。但是,你的答案是完美的。 – Steve

+0

@Steve很樂意提供幫助。 –