2010-08-20 141 views
3

我的MVVM应用程序以App.xaml.cs开头MVVM - 如何显示视图?

这里我创建一个主窗口。它有框架。在这里我把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 Toolkit。

回答

0

我不知道的MVVM工具包的任何东西,但一个简单的方法,我这样做是为了有一个委托做,是这样的:(简化代码)

private void OnStartup(object sender, StartupEventArgs e) 
{ 
    LoginViewModel loginVM = new LoginViewModel(); 

    loginVM.ShowNextScreen +=() => { 
     SomeOtherVM nextVM = new SomeOtherVM(); 
     nextVM.ShowForm(); 
    } 

    // ... 
} 

所以,你有一个' ShowNextScreen'在您的VM上调用此代码的操作。

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

但是,这是会得到迅速复杂,应用程序的任何合理的大小,你会想出来拆分此功能,变成某种“应用控制”其中涉及开屏,导航等

2

在像这样的情况你可以让你的启动窗体成为你的主程序,登录是一个对话框。如果对话框失败,请退出程序。如果成功,请继续加载主窗体。

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 

}