2016-02-12 160 views
1

我所擁有的是三種不同的觀點。我對這些觀點都有看法。我做的是視圖設置爲相應的視圖模型的新實例的DataContext的,這就像如下圖所示:DataContext綁定

public LoginScreen() 
     { 
      InitializeComponent(); 
      DataContext = new LoginScreenViewModel(); 
     } 

根據需要這個工作。一切都正確地結合在一起。

現在,我將每個視圖設置爲UserControls。我有我的窗口,對我的每一個觀點的DataTemplates如下圖所示:

<Window.Resources> 
     <DataTemplate DataType="{x:Type vm:LoginScreenViewModel}"> 
      <v:LoginScreen/> 
     </DataTemplate> 
     <DataTemplate DataType="{x:Type vm:MainWindowViewModel}"> 
      <v:MainWindow/> 
     </DataTemplate> 
     <DataTemplate DataType="{x:Type vm:AboutScreenViewModel}"> 
      <v:AboutScreenView/> 
     </DataTemplate> 
    </Window.Resources> 

我顯示類似的看法如此:

<Grid> 
     <ContentControl Content="{Binding CurrentView}"/> 
</Grid> 

這讓我創造我的窗口視圖模型的ViewModels設置它們因爲CurrentView和與該視圖模型關聯的視圖顯示在窗口中。這一切正常工作。

我的問題是,如果我切換視圖,存儲在視圖的ViewModel中的所有信息都將被銷燬。我的問題是,如何將每個視圖的datacontext綁定到正在創建它的視圖模型,而不是在後面的代碼中的新實例?

+1

而不是使用new()實例化您的ViewModel,請嘗試使用SimpleIoC或其他框架來創建您的ViewModel類的單身人士 – Mangist

回答

1

我想你在這裏有點困惑。您不需要明確地爲views創建DataContext(s)。當您的ViewModel定義您的視圖時,它也會傳遞到您的View,因爲它是DataContext

不分配DataContext明確,並嘗試檢查一個視圖的 DataContext它被加載後。這將是實際上導致view加載的ViewModel

例如如果你的看法是你的LoginScreen的DataContext將vm:LoginScreenViewModel。 LoginScreen加載後不需要創建vm:LoginScreenViewModel的新對象,並將其分配給視圖。

+0

哇。那很簡單。我認爲這是一件容易的事情。剛剛從後面的代碼中刪除數據上下文,它完美的工作。謝啦。 – ProgrammingDude

+0

@編程不要受到您的歡迎。 :) –

0

從視圖模型中實例化視圖可能會更好。在CurrentView Content Control所在的位置實例化視圖模型,並將Content屬性設置爲視圖模型中包含的視圖。這樣,每次切換視圖時都不會重新創建它們。