2012-03-04 47 views
6

我正在創建一個簡單的WPF應用程序。我有一個函數OpenFile:我應該把這個函數放在View(代碼隱藏)還是ViewModel中?

private void OpenFile(string fileName) 
{ 
    if(!File.Exists(Helper.GetPath(fileName))) 
    { 
     MessageBox.Show("Error opening file"); 
    } 
    else 
    { 
     //Code to handle file opening 
    } 
} 

理想情況下,這個函數應該在哪裏?我覺得它應該在.xaml.cs,因爲它訪問了一個MessageBox,它來自View部分。但它也叫我的助手,這是在模型中。所以我也認爲它可以在ViewModel。在ViewViewModel中有什麼優勢?有人能幫我一些指點嗎?

謝謝。

回答

7

之一將其放置在視圖模型將是可測試性的優點。您可以編寫一個單元測試,檢查消息框是否僅在文件存在的情況下才顯示(更準確的說,如果您正在訪問文件系統,則會進行集成測試)。

但是,因爲您正在直接使用消息框,所以測試永遠不會在構建服務器上完成,因爲在顯示消息框時,計算機將等待用戶輸入。

因此,我將努力對您的視圖模型的抽象,這樣就可以mock the message box在測試過程中。

7

該功能必須在視圖模型。您需要在視圖中創建一個用於顯示錯誤消息的操作,並調用此方法而不是MessageBox.Show。顯示消息框需要在View中完成。

通常,您應該避免在View內部實現任何業務邏輯,例如驗證或處理文件。

2

如果您使用的是Microsoft Prism,則可以使用IInteractionRequest界面使視圖創建MessageBox,但實際上將必要的響應傳遞迴視圖模型。

如果你是而不是使用Microsoft Prism,那麼看看這個部分是如何工作的,並且模擬它或者使用一個類似的框架。


基本上,該代碼應該去你的視圖模型的可測試性,但更換線路,你顯式調用MessageBox並且改用提到的IInteractionRequest

以下是與您要實施的場景相關的文檔:Chapter 6: Advanced MVVM Scenarios。請看用戶互動模式

相關問題