MvvM 模型启动对话框

本文关键字:对话框 启动 模型 MvvM | 更新日期: 2023-09-27 18:36:05

我知道有很多关于ViewModel应该如何打开对话框的问题,模型如何启动对话框?

模型是否应该调用对话框服务,

即调用视图模型的对话框服务,一直到视图? 模型是否应该引用 mvvm-light 工具包?

特别是针对我的情况 - 当我的模型传递一些数据来恢复/解释和构建模型对象时(我认为这应该是模型的工作) - 可能会引发错误。


更新#1:根据fmunkert的评论,我已经接受了下面的答案。 我意识到我问错了问题,根本问题是为模型设计一个范式来表示错误。

MvvM 模型启动对话框

由于 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方法所需的数据。我希望这对:)有所帮助