在邻居的帖子中: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
}
}
- 如果我们要更改“显示”按钮状态(启用/禁用),我们将需要添加管理按钮状态的逻辑;
- 源代码与“旧式”WinForms 和 MFC 源代码非常相似 - 我不确定这是好是坏,请指教。
- 还有什么我错过的吗?
另一种方法:
在 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/