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

标签 wpf mvvm model dialog synchronous

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

我不知道如何在 M-V-VM 架构中干净地做到这一点:如果我需要根据传入数据更新 GUI,事件和绑定(bind)到可观察集合很好,但是如果我在回复之前确实需要用户的回答怎么办?

更糟糕的是,我想同步进行,因为我希望我的回复算法在一个地方,而不是划分为多个回调,并不清楚“谁调用谁”的责任。

简单地说,像

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

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

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

谢谢!

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

最佳答案

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

在我的项目中,我们使用 PRISM除了提供服务框架外,它还提供了其他工具来简化 GUI 开发。

Here's关于服务如何在 PRISM 中工作的文章。

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

MVVM + 服务 = 终极力量!

关于wpf - 如何在 Model-View-Viewmodel 架构中从模型方法的中间干净地获取用户输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/884831/

相关文章:

android - 在 fragment 和 Activity 中观察 LiveData 实例

ruby-on-rails - 在 Rails 中,如何将多个模型关联到一个将统领所有模型的模型?

WPF 标签前景色

WPF:由于样式和/或修改的列表框,Groupstyle 无法正常工作

wpf - 如何在 XAML 中设置 ComboBox DataContext?

c# - WPF 确定用户在 ItemsControl 中单击的 DataTemplate 对象

c# - 一般拖放 ListBoxItems

ruby-on-rails - 如何将多个模型类放在一个模块中以在 Rails 中使用

r - 使用其他自变量的所有可能组合获取许多模型中特定变量的 p 值

c# - 在 WPF 中打印带有动态数据的流文档