MVVM和命令如何显示更多GUI

6

我喜欢 MVVM 中的 RelayCommand 的想法,它由 ViewModel 公开。这很好和优雅,适用于无需进一步用户输入即可完成的操作。简单明了。易于测试。

但是,并非所有操作都没有 UI。有些需要确认("确定要删除吗?"),而其他一些则需要更多信息。打开文件可能涉及从 File Open 对话框到完整的导入向导的任何内容。

在 MVVM 应用程序中,编写需要用户输入的命令的最佳方法是什么?是否有已经建立的模式可以通过依赖注入来解决此问题?我应该在代码后台编写 KeyDown 处理程序,并明确执行事件吗?应该回退到 RoutedUICommand 并将所有“显示下一个 GUI”代码放在我的 View 中吗?还是有什么明显的东西我完全错过了?

2个回答

5
我通常使用依赖注入来注入某种抽象的IShowTheInterface东西,然后从命令中调用该抽象的方法。这些方法应该给您提供答案,以确定是否继续执行操作以及用户提供了什么输入。
最近我在一篇有点不同主题的博客文章中举了这个例子。

1

这种东西(确认对话框、文件打开对话框等)通常在应用程序之间共享。因此,我的偏好是根本不将它们放在ViewModel中。

ViewModel是特定于应用程序的,无限扩展ViewModelBase并不是一个好主意。相反,创建可重用的行为以扩展视图。在Expression Blend Gallery中有很多行为示例。

编辑:

行为可以具有属性,您不仅可以使用这些属性来指定行为特性,还可以使用它们来获得一些反馈:

<Button Content="Open Document">
    <i:Interaction.Behaviors>
        <local:FileOpenBehavior 
            FileNameTarget="{Binding ElementName=tbDocName}"/>
    </i:Interaction.Behaviors>
</Button>

在上面的例子中,tbDocName 可以被隐藏 - 或者你可以绑定到你的 ModelView 的一个属性。

“显示打开对话框”部分可能是可重用的;但是你需要对该文件进行某些应用程序特定的操作,这将是应用程序特定的,所以我不确定我是否理解了这个过程。您能举个例子说明如何使用行为来完成此操作吗? - Joe White
@joe-white 向 UI 堆栈发送一条路由消息,该消息将被捕获并中继到 ViewModel…或者如果您绑定到 ViewModel 上的属性,则当属性更改时,您将知道文件已分配。 - Sergey Aldoukhov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接