【问题标题】:MVVM - how show view?MVVM - 如何显示视图?
【发布时间】:2011-04-01 18:09:47
【问题描述】:

我的 MVVM 应用程序从 App.xaml.cs 开始

在这里我创建了一个主窗口。它有框架。这里我放了 LoginView。

它有“登录”按钮。我有命令,它检查并登录。

我在 LoginViewModel 中有这段代码。 如果一切正常 - 我应该显示下一个视图。我该怎么做?

App.xaml.cs

        private void OnStartup(object sender, StartupEventArgs e)
        {
            LoginViewModel loginVM = new LoginViewModel();    
            MainView mainView = new MainView();            
            LoginView loginView = new LoginView();
            loginView.DataContext = loginVM;
            mainView.Frame.Content = loginView;
            mainView.Show();

        }

LoginViewModel.cs

// this method calls by binding after Click Login in LoginView
    private void Login()
        {
            //TODO: Realize it
            if (LoginModel.Login("User1", "Password"))
            {
               // HERE I SHOULD CLOSE LOGINVIEW AND SHOW NEXT VIEW
            }
        }

我应该如何以及在哪里显示所有必要的视图? 我现在使用 WPF MVVM 工具包。

【问题讨论】:

    标签: wpf mvvm view show


    【解决方案1】:

    在这种情况下,您可以将启动表单作为主程序,而登录是一个对话框。如果对话框失败,退出程序。如果成功,则继续加载主窗体。

    private void OnStartup(object sender, StartupEventArgs e)
    {
        LoginViewModel loginVM = new LoginViewModel(); 
        LoginView loginView = new LoginView();    
        loginView.DataContext = loginVM;  
        loginView.ShowDialog(); // Change this to a ShowDialog instead of Show     
    
        if (!login.DialogResult.GetValueOrDefault())
        {
            // Should probably handle error in login class, not here");
            Environment.Exit(0);
        }
    
        // This code will never get reached if Login fails
        MainView mainView = new MainView();   
        mainView.Frame.Content = loginView;
        mainView.Show(); // Change this to a ShowDialog instead of Show
    
    }
    

    【讨论】:

      【解决方案2】:

      我对 MVVM 工具包一无所知,但我这样做的一个简单方法是让一个委托来执行它,例如:(简化代码)

      private void OnStartup(object sender, StartupEventArgs e) 
      { 
          LoginViewModel loginVM = new LoginViewModel();
      
          loginVM.ShowNextScreen += () => {
              SomeOtherVM nextVM = new SomeOtherVM();
              nextVM.ShowForm();
          }
      
          // ...
      } 
      

      因此,您的虚拟机上有一个“ShowNextScreen”操作来调用此代码。

      我有 a small app on Google Code 这样做(它还处理只打开一个表单、错误处理等)。请注意,在这种情况下,负责打开视图的是 ViewModel。

      但这很快就会变得复杂,对于任何合理大小的应用程序,您都希望将此功能拆分为某种“应用程序控制器”来处理打开屏幕、导航等。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-17
        • 1970-01-01
        • 1970-01-01
        • 2016-06-23
        • 1970-01-01
        • 2014-08-04
        • 1970-01-01
        • 2021-04-04
        相关资源
        最近更新 更多