c# - 使用 MVVM 在 WPF 中创建新窗口的最佳方法

标签 c# .net wpf mvvm

在邻居的帖子中:How should the ViewModel close the form? 我已经发布了如何使用 MVVM 关闭窗口的设想。现在我有一个问题:如何打开它们。

我有一个主窗口(主视图)。如果用户单击“显示”按钮,则应显示“演示”窗口(模态对话框)。使用 MVVM 模式创建和打开窗口的最佳方式是什么?我看到两种通用方法:

第一个(可能是最简单的)。事件处理程序“ShowButton_Click”应该在主窗口的代码后面以如下方式实现:

        private void ModifyButton_Click(object sender, RoutedEventArgs e)
        {
            ShowWindow wnd = new ShowWindow(anyKindOfData);
            bool? res = wnd.ShowDialog();
            if (res != null && res.Value)
            {
                //  ... store changes if neecssary
            }
        }
  1. 如果我们要更改“显示”按钮状态(启用/禁用),我们将需要添加管理按钮状态的逻辑;
  2. 源代码与“旧式”WinForms 和 MFC 源代码非常相似 - 我不确定这是好是坏,请指教。
  3. 还有什么我错过的吗?

另一种方法:

在 MainWindowViewModel 中,我们将实现“ShowCommand”属性,该属性将返回命令的 ICommand 接口(interface)。依次命令:

  • 将引发“ShowDialogEvent”;
  • 将管理按钮状态。

这种方法更适合 MVVM,但需要额外的编码:ViewModel 类不能“显示对话框”,因此 MainWindowViewModel 只会引发“ShowDialogEvent”,我们需要在 MainWindowView 的 MainWindow_Loaded 方法中添加事件处理程序,像这样:

((MainWindowViewModel)DataContext).ShowDialogEvent += ShowDialog;

(ShowDialog - 类似于“ModifyButton_Click”方法。)

所以我的问题是: 1. 你看到任何其他方法吗? 2. 你认为列出的其中一项是好是坏? (为什么?)

欢迎任何其他想法。

谢谢。

最佳答案

一些 MVVM 框架(例如 MVVM Light )使用 Mediator pattern . 因此,要打开一个新窗口(或创建任何 View ),一些特定于 View 的代码将订阅来自中介的消息,而 ViewModel 将发送这些消息。

像这样:

订阅

Messenger.Default.Register<DialogMessage>(this, ProcessDialogMessage);
...
private void ProcessDialogMessage(DialogMessage message)
{
     // Instantiate new view depending on the message details
}

在 View 模型中

Messenger.Default.Send(new DialogMessage(...));

我更喜欢在单例类中进行订阅,只要应用程序的 UI 部分存在,它就会“存在”。 总结一下:ViewModel 传递诸如“我需要创建一个 View ”之类的消息,而 UI 会监听这些消息并对其进行操作。

当然,没有“理想”的方法。

关于c# - 使用 MVVM 在 WPF 中创建新窗口的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2108949/

相关文章:

c# - 为什么我会收到此消息 : Cannot convert type 'bool' to 'string'

c# - 我如何找到我得到 "Exception of type ' System.Web.HttpUnhandledException' 被抛出的原因?

c# - 向 TextBox 添加新的数据行

c# - XAML ListBox 只显示类名

wpf - 为什么两个模型不应该互相交谈

c# - LINQ LEFT JOIN where 子句不起作用

c# - 如何首先使用迁移向 Entity Framework 4.3 代码中的列添加描述?

c# - 仅对某些 Controller 使用 OAuth Bearer token

c# - 如何解析 winmail.dat 文件?

c# - 多线程上的 WPF UI?