2011-02-26 101 views
1

因此,我有一个可编辑的ViewModel,我不想通过对话框窗口进行编辑。WPF:如何关闭按钮单击对话框

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

这一切正常,但我有这个问题。

首先保存命令起作用,但不关闭对话框。其次,它会破坏MVVM,因为VM必须知道EditDialog视图来创建它。

当我点击X关闭按钮时会发生什么。我知道一个对话框通常会返回false作为DialogResult,但在这里我不处理结果。

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

编辑

我也注意到,如果我用.ShowDialog即使我公开为文本框,我不能编辑任何内容。这是因为模态对话框应该如何工作?

回答

2

我看到两种方法在这里:

1)EditorVM不知道什么对话框。在这种情况下,我会把这个虚拟机作为一个简单的编辑器来暴露属性,但没有SaveCommand。然后Save按钮应该从外部注入,在某个地方打开对话框。然后在关闭对话框后,检查是否使用Save按钮关闭对话框,或使用Cancel按钮关闭对话框。然后,打开对话框的代码应该检查返回的结果,如果对话框关闭了Save按钮,则调用Save方法。使用这种方法,您必须使对话更加复杂一些 - 您必须从ShowDialog方法中插入SaveCancel按钮,而不是将它们作为要显示的ViewModel的一部分来拉动它们。但是这种方法允许将您的EditorVM与任何特定于对话的行为隔离开来。

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

+0

好吧,我没有完全得到解决方案1。那么你在哪里打开对话框?另外我不确定我是否愿意添加一个完整的IWindowManager,当我除了应用程序窗口之外只打开1个Modal。感谢您的输入。 – 2011-02-26 13:18:25

+0

@Ingó,尽管我们也只有一个模式窗口,但我有'IWindowManager'。具有此服务的原因是将ViewModel从完全与View相关的代码(对话框窗口)中分离出来。在第一种情况下,我会使用来自外部ViewModel的'IWindowManager'打开对话框。假设它是一些具有'EditCommand'的viewModel。这个命令应该创建'EditorViewModel'并在对话框中打开它。 – Snowbear 2011-02-26 14:01:28

+0

我正在考虑这一点,但这意味着必须在ViewModel中添加另一项服务。它是否与服务臃肿没有问题?如果我可以让容器处理它,这将是没有问题的,但模型是我添加的东西之一,所以我不能做一个容器解决。 – 2011-02-26 14:06:30

相关问题