我有三种不同的观点。我对每个视图都有视图模型。我所做的是将视图的数据文本设置为各自视图模型的一个新实例,其工作方式如下所示:
public LoginScreen()
{
InitializeComponent();
DataContext = new LoginScreenViewModel();
}这是按需要工作的。一切都是正确的。
现在,我的每个视图都设置为UserControls。我的窗口为我的每个视图提供了数据板,如下所示:
<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>这允许我在窗口的视图模型中创建视图模型,将其设置为CurrentView,并在窗口中显示与该视图模型关联的视图。这一切都是正确的。
我的问题是,如果我切换视图,存储在视图的ViewModel中的所有信息都会被销毁。我的问题是,如何将每个视图的数据文本绑定到正在创建它的视图模型,而不是绑定到后面代码中的一个新实例?
发布于 2016-02-12 18:17:12
我想你在这里有点困惑。您不需要显式地为您的DataContext(s)创建views。当您的ViewModel定义您的视图时,它也作为DataContext传递给您的View。
不要显式地分配一个
DataContext,并在视图加载后尝试检查它的DataContext。实际上是ViewModel导致了view的加载。
例如,,,如果您的视图是LoginScreen,则您的DataContext将是vm:LoginScreenViewModel。在加载vm:LoginScreenViewModel并将其分配给视图之后,不需要创建LoginScreen的新对象。
发布于 2016-02-12 16:51:24
从视图模型实例化视图可能会更好。在CurrentView内容控件所在的地方实例化视图模型,只需将Content属性设置为视图模型中包含的视图。这样,每次切换视图时都不会重新创建它们。
https://stackoverflow.com/questions/35367868
复制相似问题