MVVM,ViewModel,Model&提示消息框

时间:2014-10-31 22:11:55

标签: c# wpf mvvm viewmodel messagebox

我理解不在ViewModel代码或Model代码中调用MessageBox的基本原则,而是使用某种类型的回调,无论是在构造时添加到ViewModel的接口还是func声明。

到目前为止,非常好。

但是给出的示例到目前为止只能按下View中的按钮,然后ViewModel通过回调引发MessageBox以确认然后继续。

但是如果模型在实现用户反馈需求之前先做了很多事情呢?我是否也给模型提供了回调函数?

是否必须采用不同的设计?

任何建议表示赞赏。 : - )

3 个答案:

答案 0 :(得分:1)

在我看来,从你的模型中提出回调不应该是一个大问题,但我想这取决于你的架构和你的个人喜好。

因此,如果您真的不想让任何回调连接到模型中的视图,您可以让您的mvvm(或您的演示文稿/应用程序层)处理控制流而不是让模型执行此操作。

您可以更精细地实现模型方法,并让应用程序层协调模型的操作。这样,只要模型操作完成并且需要用户输入,mvvm层就可以引发回调。

示例:

// method of your view model / application layer
public void InteractiveProcessing()
{
     // business logic is separated in smaller chunks
     model.DoFirstPartOfOperation();
     // check if model needs additional user input
     if(model.NeedsInput)
        // raise callback here, let user enter input etc...
     // continue processing with user input
     model.DoSecondPartOfOperation(userInput);
}

当然,只有将业务逻辑拆分为较小的部分才有意义。

答案 1 :(得分:0)

您公开一个公共事件,并让View(.xaml.cs)在启动时收听它。代码仍将在工作线程上运行,但后端逻辑在单元测试期间不会挂起。

答案 2 :(得分:0)

好的,我想我已经明白了。

在我的模型中,我在一个名为IIOServices的自编写接口中封装了对文件系统的每次调用,并在名为IUIServices的接口中封装了所有的UI调用。

UIServices只使用标准数据类型或自定义枚举,而不使用System.Windows.Forms或System.Windows命名空间。

然后,模型的客户端负责提供访问FileOpenDialogs和MessageBoxes的实现,以及他们喜欢的任何方式。

如果有兴趣的话,我可以在这里找到这个实现的示例代码(对于学习体验保持较小):

MVVM with MessageBoxes sample code