所以我有一个可编辑的ViewModel,我不想通过对话窗口进行编辑。
通常,ViewModels视图仅显示数据,但您可以按下编辑按钮,通过调用window.showDialog()打开一个新的Xaml窗口。该窗口将viewModel作为DataContext接收,将其属性公开为可编辑,并将Save和Cancel命令绑定到按钮。
一切正常,但我遇到了一些问题。
首先,save命令有效,但不会关闭对话框。其次它破坏了MVVM,因为VM必须知道EditDialog视图才能创建它。
当我点击X关闭按钮时会发生什么。我知道Dialog通常会返回false作为DialogResult,但在这里我没有处理结果。
有没有人做过类似的但是优雅地使用MVVM?
修改
我还注意到,如果我使用.ShowDialog,即使我公开为TextBox,也无法编辑任何内容。这是因为Modal Dialogs应该如何工作吗?
答案 0 :(得分:2)
我在这里看到两种方式:
1)EditorVM
对对话没有任何了解。在这种情况下,我会将此VM保留为一个简单的编辑器,它公开属性但没有SaveCommand
。然后应该从外面注入Save
按钮,在那里打开一个对话框。然后在关闭对话框后,使用Save
按钮检查对话框是否已关闭,或者使用Cancel
按钮关闭对话框。然后打开对话框的代码应检查返回的结果,如果使用Save
按钮关闭对话框,则调用Save
方法。使用这种方法,您必须使对话更复杂一点 - 您必须从Save
方法插入Cancel
和ShowDialog
按钮,而不是将它们作为{{1这将显示。但是这种方法允许将ViewModel
与任何特定于对话框的行为隔离开来。
2)EditorVM
假定它是在对话框中打开的,并且在EditorVM
命令处理程序中它保存了它的内容并关闭了对话框。为了访问对话框的功能,我通常使用某种Save
服务来处理所有打开的窗口,并且可以确定哪个对话框包含哪个viewModel并可以相应地关闭它们。基本上,此IWindowManager
服务的方法类似于IWindowManager
。