modalilty是MVVM中的反模式吗?

modalilty是MVVM中的反模式吗?,mvvm,modal-dialog,anti-patterns,Mvvm,Modal Dialog,Anti Patterns,在讨论视图模型之间的通信模式时,存在一个问题 我最近很难在WPF MVVM应用程序中实现一个模式对话框,但是我越想它,就越能理解为什么它很难实现,为什么没有内置的帮助程序来实现这一点。针对不同的平台只会增强这种视图:对于显示所选项目详细信息的模式对话框来说,看起来可能合适的内容通常是通过在移动设备上导航到不同的视图来实现的 所以我要问那些成功实现MVVM模式并避免代码隐藏的人:你们也避免了模态对话框吗?你找到了什么合适的替代品?我至少可以想到两个: 在新视图中放置子(模态)视图,并使用pub/

在讨论视图模型之间的通信模式时,存在一个问题

我最近很难在WPF MVVM应用程序中实现一个模式对话框,但是我越想它,就越能理解为什么它很难实现,为什么没有内置的帮助程序来实现这一点。针对不同的平台只会增强这种视图:对于显示所选项目详细信息的模式对话框来说,看起来可能合适的内容通常是通过在移动设备上导航到不同的视图来实现的

所以我要问那些成功实现MVVM模式并避免代码隐藏的人:你们也避免了模态对话框吗?你找到了什么合适的替代品?我至少可以想到两个:

  • 在新视图中放置子(模态)视图,并使用pub/sub实现父模型和子模型之间的通信
  • 将带有子控件的面板直接添加到父视图,只需打开其可见性即可将子视图作为弹出窗口激活
第二种方法当然更有限,当父视图可以生成各种子视图时,它实际上不起作用,但当父视图需要显示一个小的弹出窗口时,它看起来很合适。或者,作为更通用的方法,使用第一种方法更好吗。还有其他选择吗?

我在mvvm中创建对话框的方式

调用对话框窗口的ViewModel:

 var result = this.uiDialogService.ShowDialog("Dialogwindow title goes here", dialogwindowVM);

 ... do anything with the dialog result...

谢谢,我见过这种方法。我对此不确定,因为我们将对话框视为服务,所以在此类服务中显示对话框与调用Web服务之间没有太大区别。换句话说,即使每个单独的对话框都可以使用MVVM模式实现,我们也会将其从共享的MVVM空间中移除。另一件事是,我们声明某些操作必须使用DialogService。如果它在不同的平台上使用不同的方法呢?那我们就不能再利用它了。你说的再利用是什么意思?重用.net视图模型??是的,我见过视图模型打包在可移植类库中,并在WPF、Windows应用商店、Windows Phone甚至iOS/Android应用程序之间重用。我想以这种方式构建我的模型,尽管这需要一些努力来弄清楚如何构建。我明白了。您可以重用这样的服务,因为它只是一个接口。我在项目中使用MEF导出/导入实现。