我知道有很多關於ViewModel應該如何打開一個對話框的問題,Model如何啓動對話框?MvvM Model啓動對話框
模型應該調用一個對話服務,它調用viewmodel的對話服務,一直到視圖?該模型是否應該引用mvvm-light工具包?
特別針對我的情況 - 當我的模型傳遞一些數據以恢復/解釋和構建模型對象(我認爲這應該是模型的工作) - 可能會引發錯誤。
更新#1:根據fmunkert的評論我接受了以下答案。我意識到我在問錯誤的問題,而根本問題在於爲模型設計一個範例來表示錯誤。
我知道有很多關於ViewModel應該如何打開一個對話框的問題,Model如何啓動對話框?MvvM Model啓動對話框
模型應該調用一個對話服務,它調用viewmodel的對話服務,一直到視圖?該模型是否應該引用mvvm-light工具包?
特別針對我的情況 - 當我的模型傳遞一些數據以恢復/解釋和構建模型對象(我認爲這應該是模型的工作) - 可能會引發錯誤。
更新#1:根據fmunkert的評論我接受了以下答案。我意識到我在問錯誤的問題,而根本問題在於爲模型設計一個範例來表示錯誤。
由於MVVM不是標準,因爲沒有確定MVVM中什麼是正確的權威權威,您可以以任何您認爲合適的方式實現對話框,只要您不調用任何WPF直接從ViewModel或模型進行對話。通過「服務」
模式對話框從視圖模型稱爲:
在我最近寫的應用程序,我用下面的兩種方法(用我自己的MVVM框架庫)。即ViewModel有一種方法可以用ShowModalDialog()
方法獲得IFrontend
指針。 IFrontend
有兩種通用實現:一種用於WPF(它打開一個對話框),另一種用於單元測試環境(它只是模擬一個對話框)。
非模態對話框有時可以在ViewModel不知道它們的情況下打開。例如。如果您需要能夠打開字體選擇對話框的窗體有ViewModel,那麼這是一個用戶界面細節,並且ViewModel確實需要了解這些細節。 ViewModel不關心是使用對話框還是使用下拉列表選擇字體。
如果您使用的是第三方庫,如MVVM Light或Prism,那麼您可能應該遵循庫文檔中的建議。
我不確定您是否仍在尋找任何幫助,但我在對話框中採取的方法是讓視圖模型引發視圖可以處理的事件。該視圖現在可以執行任何想要將數據傳送到視圖模型的操作,因此您可以在視圖中顯示對話框而不會出現問題。您將對話的響應傳遞給事件的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
方法。我希望這有助於:)
感謝您的回覆,但您如何建議從模型中打開一個對話框?在模型中添加IViewModel服務似乎不太合適。 – sfm
這取決於你的模型如何表示錯誤。例如,如果模型在錯誤上拋出異常,則在ViewModel中使用try-catch處理程序,並從catch子句中打開對話框。 – 2012-06-03 18:44:45
我正在將此標記爲答案,來自您上面的評論。你讓我意識到我在努力做錯事。我不應該試圖弄清楚如何從模型中打開對話框,我需要弄清楚的是如何從模型中指示錯誤。謝謝! – sfm