2012-06-03 49 views
1

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

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

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


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

回答

2

由于MVVM不是标准,因为没有确定MVVM中什么是正确的权威权威,您可以以任何您认为合适的方式实现对话框,只要您不调用任何WPF直接从ViewModel或模型进行对话。通过“服务”

  • 模式对话框从视图模型称为:

    在我最近写的应用程序,我用下面的两种方法(用我自己的MVVM框架库)。即ViewModel有一种方法可以用ShowModalDialog()方法获得IFrontend指针。 IFrontend有两种通用实现:一种用于WPF(它打开一个对话框),另一种用于单元测试环境(它只是模拟一个对话框)。

  • 非模态对话框有时可以在ViewModel不知道它们的情况下打开。例如。如果您需要能够打开字体选择对话框的窗体有ViewModel,那么这是一个用户界面细节,并且ViewModel确实需要了解这些细节。 ViewModel不关心是使用对话框还是使用下拉列表选择字体。

如果您使用的是第三方库,如MVVM Light或Prism,那么您可能应该遵循库文档中的建议。

+0

感谢您的回复,但您如何建议从模型中打开一个对话框?在模型中添加IViewModel服务似乎不太合适。 – sfm

+0

这取决于你的模型如何表示错误。例如,如果模型在错误上抛出异常,则在ViewModel中使用try-catch处理程序,并从catch子句中打开对话框。 – 2012-06-03 18:44:45

+0

我正在将此标记为答案,来自您上面的评论。你让我意识到我在努力做错事。我不应该试图弄清楚如何从模型中打开对话框,我需要弄清楚的是如何从模型中指示错误。谢谢! – sfm

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方法。我希望这有助于:)