2012-06-20 150 views
0

當用戶輸入正確的密碼時,應關閉登錄窗口並打開主窗口。我想從ViewModel做到這一點,但是,ViewModel可能對視圖沒有任何瞭解。關閉窗口並從ViewModel中打開另一個模式

我已經搜索了很多,並且顯然最好的方法是使用介體模式。我理解這種模式是如何工作的,但是在這種情況下如何有效地使用它?

調解員將需要:
- 一個參考視圖模型

視圖模型將需要調解的引用 - 在查看
的引用。

我需要在哪裏創建中介?我無法在ViewModel中執行此操作,因爲我無法將引用設置爲該視圖。在視圖中創建中介是一個選項,因爲我可以將ViewModel從DataContext屬性中取出,但是我仍然需要將中介傳遞給ViewModel,這隻會使代碼更加困難。

如何正確使用介體來打開/關閉窗口?

回答

1

中介模式用於不在視圖和視圖模型之間的視圖模型之間進行通信。

如果你想處理你的viewmodel的對話框,你可以使用對話服務,如this之一。

但是,當我想創建一個應用程序登錄對話框,我這樣做。

在app.xaml.cs

OnStartup()

  • 創建loginview
  • 創建登錄視圖模型
  • 集的DataContext爲loginview到loginviewmodel
  • 顯示loginview
  • 編輯:loginviewmodel檢查密碼等等,如果它確定,那麼在loginviewmodel中設置狀態,例如IsValidUser = TRUE;
  • 檢查結果
  • 編輯:如果DialogResult的== 「OK」 和IsValidUser =真
  • 打開主窗口

這裏我的一些代碼

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時容易得多。

+0

謝謝,但你如何檢查結果?我的意思是,用戶輸入正確的密碼,打開主窗口的代碼在哪裏以及它是如何被觸發的? – Bv202

+0

用於檢查的代碼位於您的loginviewmodel中,打開mainwindow的代碼位於您的app.xaml.cs的OnStartup()方法中 – blindmeis

相關問題