我理解不在ViewModel代码或Model代码中调用MessageBox的基本原则,而是使用某种类型的回调,无论是在构造时添加到ViewModel的接口还是func声明。
到目前为止,非常好。
但是给出的示例到目前为止只能按下View中的按钮,然后ViewModel通过回调引发MessageBox以确认然后继续。
但是如果模型在实现用户反馈需求之前先做了很多事情呢?我是否也给模型提供了回调函数?
是否必须采用不同的设计?
任何建议表示赞赏。 : - )
答案 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的实现,以及他们喜欢的任何方式。
如果有兴趣的话,我可以在这里找到这个实现的示例代码(对于学习体验保持较小):