我喜欢ViewModel公开的RelayCommand的MVVM概念。这非常优雅,对于无需进一步用户输入即可完成的操作。简单。可测试的。
但是,并非所有操作都是无UI的。有些需要确认(“您确定要删除吗?”)。其他人需要更多信息。打开文件可能需要从“文件打开”对话框到完整的导入向导。
在MVVM应用程序中,编写需要用户输入的命令的最佳方法是什么?是否存在以某种方式通过依赖注入解决此问题的既定模式?我应该在代码隐藏中编写KeyDown处理程序,并让它显式执行事件吗?我应该回到RoutedUICommand,并将所有“显示下一个GUI”代码放在我的视图中吗?或者是否有一些我完全失踪的明显事物?
答案 0 :(得分:4)
我通常使用Dependency Injection来注入某种抽象的IShowTheInterface事物,然后从Command中调用抽象方法。然后,这些方法应该为您提供所需的答案,以确定是否继续执行操作以及用户提供的输入。
我最近在blog post with a bit of a different topic中使用此作为示例。
答案 1 :(得分: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的属性。