【问题标题】:Close window and open another one from ViewModel with Mediator pattern使用 Mediator 模式关闭窗口并从 ViewModel 打开另一个窗口
【发布时间】:2012-06-22 13:56:49
【问题描述】:

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

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

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

ViewModel 需要对中介者的引用。

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

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

【问题讨论】:

    标签: c# wpf design-patterns mvvm


    【解决方案1】:

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

    如果您想处理来自视图模型的对话框,您可以使用像 this one 这样的对话框服务。

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

    在 app.xaml.cs 中的 OnStartup()

    • 创建登录视图
    • 创建登录视图模型
    • 将 loginview 的 datacontext 设置为 loginviewmodel
    • 显示登录视图
    • 编辑:loginviewmodel 检查密码等,如果正常,则在 loginviewmodel 中设置状态,例如IsValidUser=真;
    • 检查结果
    • 编辑:如果 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:这是我的应用程序中我首先使用视图的唯一部分。剩下的都是viewmodel优先,我做mvvm的时候容易多了。

    【讨论】:

    • 谢谢,但是如何检查结果?我的意思是,用户输入了正确的密码,打开主窗口的代码在哪里,它是如何触发的?
    • 检查代码在你的loginviewmodel中,打开主窗口的代码在你的app.xaml.cs OnStartup()方法中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多