如何在Model-View-Viewmodel架构中从模型方法的中间干净地获取用户输入?

Tom*_*fka 7 wpf dialog model synchronous mvvm

我正在编写一个侦听网络连接的应用程序,当某些数据到达时,它会回复,并且根据传入的数据,它可能需要在回复之前询问用户(显示对话框).

我不知道如何在MV-VM架构中干净地完成这项工作:如果我只需要根据传入的数据更新GUI,事件和对可观察集合的绑定就很好,但是如果我在回复之前确实需要来自用户的anwer怎么办? ?

更糟糕的是,我希望同步这样做,因为我希望我的回复算法位于一个地方,而不是分成多个回调,并且不清楚"谁叫谁调用谁"的责任.

简单地说,像

HandleMessage(Message msg){
    string reply;
    if (msg.type == 1) {
        reply = ...
    } else {
        string question = msg...
        reply = ShowModalDialog(question); // MVVM violation!
    }
    sender.Send(reply);
}
Run Code Online (Sandbox Code Playgroud)

但是我不想从模型中调用view或viewmodel,因为模型需要可重用和可测试 - 我不希望在每次测试运行时都弹出对话框,这将违反MVVM!没有事件(据我所知,它们只是单向的,并且没有向后通道来获取对事件源的回复)或数据绑定,因为它将是异步的.

这可行吗?这是一个我问过几个测试驱动的开发传播者的问题,到目前为止,我没有得到实际可用的答案.然而,在处理过程中需要一些额外的输入是相当普遍的.

谢谢!

编辑:这是应用程序逻辑,所以它显然属于模型,即使在这种情况下它没有,我想知道在模型中业务逻辑例程中我真正需要用户输入的情况的解决方案.

Cam*_*and 4

这是 MVVM 本身无法解决的问题之一。一种解决方案是使用服务来查询用户,然后让 ViewModel 使用该服务。

在我的项目中,我们使用PRISM,它除了提供服务框架之外,还提供其他工具来使 GUI 开发变得更容易。

以下是有关 PRISM 中服务如何工作的文章。

因此,具体来说,在您的情况下,我将创建某种 IOC,向其注册查询服务,然后在 ViewModel 中传递 IOC,然后使用 IOC 获取查询服务,并使用它来查询用户。更多的工作?当然。但这意味着您可以通过简单地在 IOC 中替换它来将查询服务替换为另一个实现来进行测试。

MVVM + 服务 = 终极力量!