2012-04-06 67 views
1

我有一個窗口,其datacontext是一個視圖模型。現在,在虛擬機和窗口(視圖)的範圍之外,我有一個將被調用的方法。該方法需要顯示窗口並讓用戶更改一些內容,然後當用戶完成時,窗口需要關閉並且方法繼續。棘手的是,我在窗口綁定了視圖模型中的命令按鈕。這些命令觸發'userCancelled'和'userOked'等事件。所以我想要捕捉這些事件以瞭解何時關閉窗口並繼續使用該方法。等待窗口關閉並捕獲窗口事件

在窗口上,如果我使用ShowDialog,事件不會被捕獲(我假設因爲線程綁在等待對話框關閉)。但是,如果我使用Show,該方法將繼續。我需要它等待。我試過Thread.Sleep,直到某個布爾值被打開,但是也綁定了線程,並使窗口不可用(使用.Show())。

我試過做一個backgroundWorker,但我仍遇到同樣的問題。

我明白我可以在按鈕上使用codebehind,但對於OK按鈕,viewModel必須驗證其狀態是否有效。有觀點諮詢視角模型打敗MVVM的鬆耦合風格的重點,對嗎?

我正在自己學習WPF和MVVM,並且我希望做到這一點,並在實際的情況下堅持優秀的設計原則。我應該怎麼做?我究竟做錯了什麼?謝謝。

+0

FYI現在我剛剛添加了Window屬性到ViewModel,並且我需要時在viewmodel中調用window.close()。我很想知道在MVVM中執行此操作的「正確」方法。 – 2012-04-06 14:49:37

+0

更新:在視圖模型中創建一個CloseWindow Action,並將窗口和視圖模型綁定在一起,通過匿名委託設置該操作等同於窗口的Close()方法(我認爲?:)將在時間允許的情況下研究棱鏡。 – 2012-04-09 14:15:52

回答

1

您可以正確地使用PrismWindowRegionAdapter做到這一點。

  1. 使用WindowRegionAdapter註冊要顯示/隱藏的視圖(用戶控件),以便在請求視圖時在新窗口中打開該視圖。
  2. 爲顯示/隱藏/關閉視圖創建CompositePresentationEvents並將它們放入一些通用基礎結構程序集中。
  3. 在包含視圖的模塊的Initialize方法中,訂閱2中創建的事件並將它們鏈接到OnShow/OnHide/OnClose事件處理程序。
  4. 在事件處理程序中,您可以使用Prism區域管理器從區域添加/刪除視圖,該視圖將依次顯示/隱藏/關閉窗口。您可以修改WindowRegionAdapter來完成您想要的操作。
  5. 然後,只要你想顯示/隱藏視圖,你可以簡單地發佈適當的顯示/隱藏事件,無論你在哪裏(無論哪個模塊/視圖模型)你想要的和適當的事件處理程序將在模塊訂閱事件和窗口將隱藏顯示。

是的,它有點複雜,但絕對值得投資,特別是如果你需要打開其他窗口。讓事情非常乾淨。

+0

現在正在研究棱鏡。謝謝你的提示。任何推薦的教程,讓我結結巴巴的呢? – 2012-04-09 12:17:29

+0

看看[這個問題]中的鏈接(http://stackoverflow.com/questions/1405739/mvvm-tutorial-from-start-to-finish)。 – NVM 2012-04-09 16:42:03