2010-04-22 39 views
4

有誰有一個想法如何更改一個MVVM視圖 - 首先,方法屏幕(視圖)(視圖實例化視圖模型:MVVM查看優先的方式如何改變視圖

DataContext="{Binding Source={StaticResource VMLocator}, 
Path=Find[EntranceViewModel]}" 

例如: 在我的MainWindow(Shell)中,我使用Button「GoToBeach」顯示一個入口視圖。

<Window> 
    <DockPanel> 
    <TextBox DockPanel.Dock="Top" Text="{Binding Title}" /> 
    <view.EntranceView DockPanel.Dock="Top" />  
    </DockPanel> 
</Window> 

當按鈕被點擊時,我想擺脫「EntranceView」並顯示「BeachView」。 我真的很好奇,如果有人知道一種方法來保持View-First方法並將屏幕(視圖)更改爲「BeachView」。 我知道有幾種方法在ViewModel-First方法中實現它,但這不是問題。 Perhabs我在我的mvvm調查中遺漏了一些東西,無法看到樹木......否則我就是 ,希望能有一個鼓舞人心的討論。

+2

如果DockPanel同時擁有EntranceView和BeachView,並且每個視圖的可見性屬性都綁定到VM的屬性會怎麼樣?我不確定我瞭解這種ViewFirst方法的含義。 – Timores 2010-04-22 16:13:38

+0

我也不確定我是否正確:)有兩個視圖可以,但是如果你有一個更大的應用程序有20個或更多的視圖...這不是很好的代碼... – CodeWeasel 2010-04-23 05:42:26

回答

1

一種可能性是在MainWindow(Shell)中使用所有視圖並使用觸發器來提供它們的可見性。但是在MainWindow中聲明的很多不同屏幕(視圖)並不適合我...

這個問題出現在閱讀這個使用MEF和MVVM的好方法時,我在John Papas博客上發現:MVVM的簡單ViewModel定位器:病人已經離開了收容所,但是視圖和視圖模型的結合就好,似乎沒有辦法改變滿足我的屏幕:)

所以在我看來,如果你有很多屏幕(視圖),你最好使用ViewModel-First-Approach ......

0

這看起來像它可能會幫助: Creating a ViewModel : do it before or after model data is available?

做不到這一點,怎麼樣只在啓動時創建視圖模型一次,並將其分配給每個視圖窗口,因爲它的創建(而不是每次都創建一個新的視圖模型) 。然後關閉第一個View並根據需要打開一個新的View,重新分配單個ViewModel實例。

+0

VMLocator可以有singleton實例的ViewModels。那不是重點。這個問題僅僅是一個簡單的View-First-Approach,其中每個視圖創建ViewModel或獲取其視圖的一個實例,而不是相反。將視圖模型分配給內容並通過數據模板處理視圖時,該視圖模型將成爲首個視圖模型。 – CodeWeasel 2010-04-23 05:46:31

+0

@CodeWeasel你確定嗎?我認爲這是一個觀點第一的方法。 – Elisabeth 2010-10-20 20:27:22

+0

@Lisa:你能給我一個進一步的解釋嗎? – CodeWeasel 2010-10-25 13:32:26

0

你可能想看看棱鏡(即複合應用程序庫)。棱鏡有助於通過區域經理在視圖之間導航。這對你的應用程序來說可能是過度的,可能需要一段時間才能得到你的頭腦。棱鏡還允許您使用MVVM模式進行開發。

您可以在棱鏡documentation中找到更多關於棱鏡和棱鏡導航的信息。