如何在 MVVM 中处理 CloseDocument 命令

How to handle CloseDocument command in MVVM

所以我有一个主要的 window 显示 MDI 类型的界面,其中打开了多个文档选项卡(就像 VS)。主 window 和文档 windows 都有各自的虚拟机。 CloseDocument 命令在文档中处理,但需要将其告知主 window VM,以便主 window VM 可以更新其文档集合。在 MVVM 中管理它的正确方法是什么?我的一些想法:

  1. 我可以向文档 VM 添加一个事件,该事件在关闭之前引发。然后我可以将它的事件侦听器添加到我添加的每个新文档的主 window VM。
  2. 我可以将 CloseDocument 命令移动到主 window VM,但理想情况下事件不属于那里。
  3. 我可以将 Documents 集合的引用传递给我的文档 VM,以便它在关闭自身之前更新集合。

在遵循 MVVM 实践时应该使用其中的哪一个(或者如果有人有更好的)?

我想我会选择解决方案 1。如果您使用 MVVM Light,那么您可以应用 Messenger 类型在文档之间传递信息。

每个文档都会有一个引用此方法的命令:

private void CloseDocumentExecuteCommand()
{
    var message = new DocumentCloseMessage() { Document = this};
    Messenger.Default.Send<DocumentCloseMessage>(message);
}

在 main Window 的 VM 中,你会得到这样的东西: (在构造函数中)

Messenger.Default.Register<CloseMessage>(this, (msgData) => this.CloseMessageReceived(msgData));

...但这只有在你有 Messenger 的情况下才有效,否则你可以使用事件,但恐怕你需要在 VM 之间使用强引用。