簡體   English   中英

我應該將此功能放在View(代碼隱藏)或ViewModel中嗎?

[英]Should I put this function in View (code-behind) or in ViewModel?

我正在創建一個簡單的WPF應用程序。 我有一個函數OpenFile:

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

理想情況下,此功能應存在於何處? 我覺得它應該在.xaml.cs因為它訪問View部分中的MessageBox。 但它也稱我的助手為模型中的助手。 所以我也認為它可以在ViewModel ViewViewModel中使用它有什么好處? 有人可以幫我提一些指示嗎?

謝謝。

將其置於視圖模型中的一個優點是可測試性。 您可以編寫單元測試,檢查是否僅在文件存在時才顯示消息框(如果您正在訪問文件系統,則更准確地說,它將是集成測試)。

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

因此,我會在視圖模型中反對抽象,以便您可以在測試期間模擬消息框

此函數必須位於ViewModel中。 您需要在視圖中創建一個操作來顯示錯誤消息並調用此方法而不是MessageBox.Show 顯示消息框需要在View完成。

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

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

如果您使用Microsoft Prism,那么請查看此部分的工作原理,並模擬它或使用類似的框架。


基本上,該代碼應該在您的視圖模型上進行測試,但是替換顯式調用MessageBox的行並使用提到的IInteractionRequest

以下是與您要實現的方案相關的文檔: 第6章:高級MVVM方案 . 請查看

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM