MvvM 模型启动对话框
本文关键字:对话框 启动 模型 MvvM | 更新日期: 2023-09-27 18:36:05
我知道有很多关于ViewModel应该如何打开对话框的问题,模型如何启动对话框?
模型是否应该调用对话框服务,即调用视图模型的对话框服务,一直到视图? 模型是否应该引用 mvvm-light 工具包?
特别是针对我的情况 - 当我的模型传递一些数据来恢复/解释和构建模型对象时(我认为这应该是模型的工作) - 可能会引发错误。
更新#1:根据fmunkert的评论,我已经接受了下面的答案。 我意识到我问错了问题,根本问题是为模型设计一个范式来表示错误。
由于 MVVM 不是标准,并且由于没有明确的权威机构来决定 MVVM 中哪些是正确的,哪些不正确,因此只要不直接从 ViewModel 或模型调用任何 WPF 对话框,就可以以您认为合适的任何方式实现对话框。
在我最近编写的应用程序中,我使用了以下两种方法(使用我自己的 MVVM 框架库):
-
模式对话框通过"服务"从视图模型调用。 即视图模型有一种方法可以使用
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
方法所需的数据。我希望这对:)有所帮助