我正在定義一個策略,其中主視圖將使用數據模板在視圖之間切換。目前,它可以在3個視圖之間切換:使用數據模板時的視圖/視圖模型的生存期
- ApplicationView:它實際上是一個由大量的 不同意見的看法,大多是從分層使用標籤/對接。這是處理應用程序數據的 視圖。
- LogInView:它用於登錄用戶。
- DialogView:它用於顯示對話框視圖。該視圖還將使用數據模板來選擇所需的適當視圖。
想法是當需要顯示對話視圖時,它被設置爲主視圖上的當前視圖。選擇完成後,此信息將傳遞給ApplicationView或屬於ApplicationView的視圖。當顯示DialogView時,ApplicationView不能從內存中釋放,因爲它的ApplicationViewModel仍然會使用數據操作(它需要在後臺持續工作)。
我想實現這個使用的DataTemplates,而ContentControl中的內容結合到CurrentView:
// in MainView
DataTemplate DataType="{x:Type vm:ApplicationViewModel}">
<vw:ApplicationView />
</DataTemplate>
.....
// in MainViewModel
public ViewModelBase CurrentView { get; set; }
基本上我試圖避免使用模態窗口的對話框。
1)這個策略是否正確,或者有些問題我不知道? 2)當我切換到DialogView(我實際上切換viewmodels)時,ApplicationView/ApplicationViewModel會發生什麼?我是否需要在某處存儲ApplicationViewModel的引用,所以它不會收集垃圾?我沒有測試過,但可能當我設置CurrentView時,將會創建一個ViewModel/View的新實例。
3)連接到第二個問題時,使用DataTemplates時,以前使用過的View/ViewModel會發生什麼變化,現在被替換爲不同的view/viewmodel?
嗨Rachel,應用程序本身應該「永不」關閉,因此應在每次換檔時運行應用程序時進行登錄。這就是爲什麼我想讓LoginView成爲應用程序的一部分。所以,如果我正確地理解了你,那麼無論我保留對ApplicationViewModel的引用以防止它被丟棄,ApplicationView將會在我切換CurrentView時立即處理掉。但是如果我隱藏視圖,視圖將不會被處置? – Goran
@Goran我看到了,在這種情況下,我只需將'Login'作爲對話彈出窗口之一,或者甚至是應用程序的'CurrentViews'之一。如果ApplicationView不可見,或者通過將其Visibility屬性設置爲不可見,或者通過更改CurrentView以使其不存在,則ApplicationView將被卸載。如果你有要保存的數據,你應該將它存儲在'ApplicationViewModel'中,所以下次你顯示'ApplicationView'時,它會重新加載到最後一個用戶的地方。 – Rachel