0

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

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

中介将需要:
- 对 View
的引用 - 对 ViewModel 的引用

ViewModel 将需要对中介的引用。

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

如何正确使用调解器打开/关闭窗口?

4

1 回答 1

1

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

如果您想处理视图模型中的对话框,您可以使用这样的对话框服务

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

在 app.xaml.cs 中的 OnStartup()

  • 创建登录视图
  • 创建登录视图模型
  • 将 loginview 的 datacontext 设置为 loginviewmodel
  • 显示登录视图
  • 编辑:loginviewmodel 检查密码等等,如果没问题,则在 loginviewmodel 中设置状态,例如 IsValidUser=true;
  • 检查结果
  • 编辑:如果 dialogresult == "OK" 和 IsValidUser=true
  • 打开的主窗口

这是我的一些代码

    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:这是我的应用程序中我首先使用视图的唯一部分。其余的都是先查看模型,这对我来说在做 mvvm 时要容易得多。

于 2012-06-20T12:40:10.617 回答