【问题标题】:Is modalilty an anti-pattern in MVVM?模态是 MVVM 中的反模式吗?
【发布时间】:2013-04-24 09:51:43
【问题描述】:

有一个interesting post 讨论视图模型之间的通信模式。

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

所以我想问那些成功实现 MVVM 模式并避免代码隐藏的人:你是否也避免了模态对话框?您找到了哪些合适的替代品?我至少能想到两个:

  • 将子(模态)视图放置在新视图中,并使用 pub/sub 实现父模型和子模型之间的通信;
  • 将带有子控件的面板直接添加到父视图,然后将其可见性以激活子视图作为弹出模拟模态。

第二种方法肯定更受限制,当父视图可以产生各种子视图时它并不真正起作用,但是当父视图需要显示一个小的单个弹出窗口时它看起来很合适。还是最好选择第一种方法,因为它更通用。还有其他选择吗?

【问题讨论】:

    标签: mvvm modal-dialog anti-patterns


    【解决方案1】:

    thats 我在 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 导出/导入实现。
    猜你喜欢
    • 2013-07-04
    • 2012-03-11
    • 2012-06-22
    • 2018-03-27
    • 2011-08-04
    • 2010-11-04
    • 2023-03-11
    相关资源
    最近更新 更多