【问题标题】:WPF: How to close Dialog on button clickWPF:如何在按钮单击时关闭对话框
【发布时间】:2011-02-26 12:49:34
【问题描述】:

所以我有一个可编辑的 ViewModel,我不希望它只能通过 Dialog 窗口进行编辑。

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

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

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

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

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

编辑

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

【问题讨论】:

    标签: wpf xaml mvvm dialog modal-dialog


    【解决方案1】:

    我在这里看到了两种方式:

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

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

    【讨论】:

    • 好吧,我没有完全得到解决方案 1。那你在哪里打开对话框呢?另外,我不确定我是否愿意添加整个 IWindowManager,因为除了应用程序窗口之外,我最多只能打开 1 个 Modal。感谢您的意见。
    • @Ingó,我有IWindowManager,尽管我们也只有一个模态窗口。拥有此服务的原因是将您的 ViewModel 与完全与View 相关的代码(对话框窗口)隔离开来。在第一种情况下,我将使用来自某个外部 ViewModel 的IWindowManager 打开对话框。假设它是一些具有EditCommand 的视图模型。此命令应创建 EditorViewModel 并在对话框中打开它。
    • 我正在考虑这个,但这意味着必须在 ViewModel 中添加另一个服务。服务变得臃肿不是问题吗?如果我可以让容器处理它,那将没问题,但模型是我添加的东西之一,所以我无法进行容器解析。
    • @Ingó,我的所有ViewModels 都注入了​​。如果在构造函数中有模型参数,解析视图模型是否有问题?
    • 好吧,我认为它们是从 DataContext 创建的,至少我不确定 Container 将如何处理它。你有一个例子吗?也许还有一个 WindowManager 类的例子?
    猜你喜欢
    • 1970-01-01
    • 2013-04-06
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多