关闭窗口并使用Mediator模式从ViewModel打开另一个窗口

时间:2012-06-20 12:19:49

标签: c# wpf design-patterns mvvm

当用户输入正确的密码时,应关闭登录窗口并打开主窗口。我想从ViewModel执行此操作,但是,ViewModel可能对该视图一无所知。

我搜索了很多,并且显然最好的方法是使用中介模式。我理解这种模式是如何工作的,但在这种情况下如何有效地使用它?

调解员需要:
- 对视图的参考
- 对ViewModel的引用

ViewModel需要对介体的引用。

我需要在哪里创建调解员?我无法在ViewModel中执行此操作,因为我无法设置对视图的引用。在视图中创建中介是一个选项,因为我可以从DataContext属性中获取ViewModel,但是我仍然需要将中介传递给ViewModel,这只会使代码更加困难。

如何正确使用中介来打开/关闭窗口?

1 个答案:

答案 0 :(得分:1)

介体模式用于视图模型之间的通信,而不是视图和视图模型之间的通信。

如果您想从视图模型处理对话框,可以使用this之类的对话服务。

然而,当我想创建一个应用程序登录对话框时,我会这样做。

在app.xaml.cs OnStartup()

  • 创建loginview
  • 创建登录viewmodel
  • 将loginview的datacontext设置为loginviewmodel
  • show loginview
  • 编辑:loginviewmodel检查密码等等,如果确定则在loginviewmodel中设置状态,例如IsValidUser = TRUE;
  • 检查结果
  • 编辑:如果dialogresult ==“OK”且IsValidUser = true
  • open mainwindow

这里是我的一些代码

    protected override void OnStartup(StartupEventArgs e)
    {
        //...
        ShutdownMode = ShutdownMode.OnExplicitShutdown;
        var vm = new LoginVM();
        var loginwindow = new LoginWindow();
        loginwindow.DataContext = vm;

        if (!result.HasValue || !result.Value || !IsValidUser)
        {
             Shutdown();
             return;
        }   

        //...
        var mainWindow = new MainWindow(new MainWindowViewModel(vm.Settings));

        mainWindow.Loaded += (sender, args) => splashScreen.Close();
        this.MainWindow = mainWindow;
        ShutdownMode = ShutdownMode.OnMainWindowClose;
        this.MainWindow.Show();

 }

ps:这是我首先使用视图的应用程序的唯一部分。其余的都是viewmodel,这对我来说在做mvvm时要容易得多。