MvvM模型启动对话框

时间:2012-06-03 17:28:16

标签: c# wpf mvvm dialog

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

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

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


更新#1:根据fmunkert的评论,我接受了以下答案。我意识到我提出了错误的问题,而根本问题在于设计模型的范例来表示错误。

2 个答案:

答案 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方法的必要数据。我希望这会有所帮助:)