2016-02-12 97 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属性设置为视图模型中包含的视图。这样,每次切换视图时都不会重新创建它们。