2010-08-20 97 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 

}