我知道有很多关于ViewModel应如何打开对话框的问题,模型启动对话框如何?
模型是否应该调用对话框服务,该服务调用viewmodel的对话框服务,一直到视图?该模型是否应该引用mvvm-light工具包?
特别针对我的情况 - 当我的模型传递一些数据来恢复/解释和构建模型对象时(我认为这应该是模型的工作) - 可能会出现错误。
更新#1:根据fmunkert的评论,我接受了以下答案。我意识到我提出了错误的问题,而根本问题在于设计模型的范例来表示错误。
答案 0 :(得分:2)
由于MVVM不是标准,并且由于没有明确的权限决定MVVM中的内容是什么以及什么不是,所以只要不调用任何WPF对话框,就可以以任何合适的方式实现对话框。直接来自ViewModel或模型。
在我最近写的应用程序中,我使用了以下两种方法(使用我自己的MVVM框架库):
通过“服务”从ViewModel调用模态对话框。即ViewModel有一种方法可以使用IFrontend
方法获取ShowModalDialog()
指针。 IFrontend
有两个通用实现:一个用于WPF(打开一个对话框),另一个用于单元测试环境(只是模拟一个对话框)。
有时可以在ViewModel不知道的情况下打开非模态对话框。例如。如果您有一个需要能够打开字体选择对话框的表单的ViewModel,那么这是一个用户界面细节,ViewModel确实需要知道该细节。 ViewModel不关心是使用对话框还是使用下拉列表选择字体。
如果您使用的是MVVM Light或Prism等第三方库,您可能应该遵循图书馆文档中的建议。
答案 1 :(得分: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
方法的必要数据。我希望这会有所帮助:)