WPF:如何在按钮单击时关闭对话框

时间:2011-02-26 12:49:35

标签: wpf xaml mvvm dialog modal-dialog

所以我有一个可编辑的ViewModel,我不想通过对话窗口进行编辑。

通常,ViewModels视图仅显示数据,但您可以按下编辑按钮,通过调用window.showDialog()打开一个新的Xaml窗口。该窗口将viewModel作为DataContext接收,将其属性公开为可编辑,并将Save和Cancel命令绑定到按钮。

一切正常,但我遇到了一些问题。

首先,save命令有效,但不会关闭对话框。其次它破坏了MVVM,因为VM必须知道EditDialog视图才能创建它。

当我点击X关闭按钮时会发生什么。我知道Dialog通常会返回false作为DialogResult,但在这里我没有处理结果。

有没有人做过类似的但是优雅地使用MVVM?

修改

我还注意到,如果我使用.ShowDialog,即使我公开为TextBox,也无法编辑任何内容。这是因为Modal Dialogs应该如何工作吗?

1 个答案:

答案 0 :(得分:2)

我在这里看到两种方式:

1)EditorVM对对话没有任何了解。在这种情况下,我会将此VM保留为一个简单的编辑器,它公开属性但没有SaveCommand。然后应该从外面注入Save按钮,在那里打开一个对话框。然后在关闭对话框后,使用Save按钮检查对话框是否已关闭,或者使用Cancel按钮关闭对话框。然后打开对话框的代码应检查返回的结果,如果使用Save按钮关闭对话框,则调用Save方法。使用这种方法,您必须使对话更复杂一点 - 您必须从Save方法插入CancelShowDialog按钮,而不是将它们作为{{1这将显示。但是这种方法允许将ViewModel与任何特定于对话框的行为隔离开来。

2)EditorVM假定它是在对话框中打开的,并且在EditorVM命令处理程序中它保存了它的内容并关闭了对话框。为了访问对话框的功能,我通常使用某种Save服务来处理所有打开的窗口,并且可以确定哪个对话框包含哪个viewModel并可以相应地关闭它们。基本上,此IWindowManager服务的方法类似于IWindowManager