我知道有很多关于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