2012-06-03 52 views
1

我知道有很多關於ViewModel應該如何打開一個對話框的問題,Model如何啓動對話框?MvvM Model啓動對話框

模型應該調用一個對話服務,它調用viewmodel的對話服務,一直到視圖?該模型是否應該引用mvvm-light工具包?

特別針對我的情況 - 當我的模型傳遞一些數據以恢復/解釋和構建模型對象(我認爲這應該是模型的工作) - 可能會引發錯誤。


更新#1:根據fmunkert的評論我接受了以下答案。我意識到我在問錯誤的問題,而根本問題在於爲模型設計一個範例來表示錯誤。

回答

2

由於MVVM不是標準,因爲沒有確定MVVM中什麼是正確的權威權威,您可以以任何您認爲合適的方式實現對話框,只要您不調用任何WPF直接從ViewModel或模型進行對話。通過「服務」

  • 模式對話框從視圖模型稱爲:

    在我最近寫的應用程序,我用下面的兩種方法(用我自己的MVVM框架庫)。即ViewModel有一種方法可以用ShowModalDialog()方法獲得IFrontend指針。 IFrontend有兩種通用實現:一種用於WPF(它打開一個對話框),另一種用於單元測試環境(它只是模擬一個對話框)。

  • 非模態對話框有時可以在ViewModel不知道它們的情況下打開。例如。如果您需要能夠打開字體選擇對話框的窗體有ViewModel,那麼這是一個用戶界面細節,並且ViewModel確實需要了解這些細節。 ViewModel不關心是使用對話框還是使用下拉列表選擇字體。

如果您使用的是第三方庫,如MVVM Light或Prism,那麼您可能應該遵循庫文檔中的建議。

+0

感謝您的回覆,但您如何建議從模型中打開一個對話框?在模型中添加IViewModel服務似乎不太合適。 – sfm

+0

這取決於你的模型如何表示錯誤。例如,如果模型在錯誤上拋出異常,則在ViewModel中使用try-catch處理程序,並從catch子句中打開對話框。 – 2012-06-03 18:44:45

+0

我正在將此標記爲答案,來自您上面的評論。你讓我意識到我在努力做錯事。我不應該試圖弄清楚如何從模型中打開對話框,我需要弄清楚的是如何從模型中指示錯誤。謝謝! – sfm

0

我不確定您是否仍在尋找任何幫助,但我在對話框中採取的方法是讓視圖模型引發視圖可以處理的事件。該視圖現在可以執行任何想要將數據傳送到視圖模型的操作,因此您可以在視圖中顯示對話框而不會出現問題。您將對話的響應傳遞給事件的EventArgs,以便視圖模型具有正在查找的數據以便繼續。

例如:

Public Class View 

    Private WithEvents _VM AS new ViewModel() 

    Private Sub _VM_AddingItem(Sender AS Object, E AS ViewModel.ItemEventArgs) 
     Dim Dialog As new SomeDialog() 

     If Dialog.ShowDialog then 
     E.Item = Dialog.Item 
     Else 
     E.Cancel = True 
     End If 
    End Sub 

End Class 


Public Class ViewModel 
    Public Sub AddItem(Item AS Object) 
     Do Some Work here 
    End Sub 

    Private Sub _AddItem() 
     Dim Args AS New ItemEventArgs() 

     OnAddingItem(Args) 

     If not Args.Cancel Then AddItem(Args.Item) 
    End Sub 

    Protected Sub OnAddingItem() 
     RaiseEvent AddingItem(me, ItemEventArgs) 
    End Sub 

    Public Event AddingItem(Sender AS Object, E As ItemEventArgs) 

    Public Class ItemEventArgs 
     Public Property Item AS Object 
     Public Property Cancel AS Boolean = false 
    End Class 
End Class 

然後,只需你的命令線了私人_AddItem方法,只是引發事件收集必要數據的AddItem方法。我希望這有助於:)