我所拥有的是三种不同的观点。我有每个视图的视图模型。我所做的是将视图的datacontext设置为相应视图模型的新实例,其工作方式如下所示:
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,并在窗口中显示与该视图模型关联的视图。一切正常。
我的问题是,如果我切换视图,那么存储在View的ViewModel中的所有信息都会被销毁。我的问题是,如何将每个视图的datacontext绑定到创建它的viewmodel而不是后面的代码中的新实例?
答案 0 :(得分:1)
我觉得你在这里有点困惑。您无需明确为DataContext(s)
创建views
。在ViewModel
定义您的观看后,它也会传递给View
,因为它DataContext
。
请勿明确指定
DataContext
并尝试检查 加载后的视图的DataContext
。这将是ViewModel
这实际上导致view
加载。
例如如果您的视图为LoginScreen
,则您的DataContext将为vm:LoginScreenViewModel
。加载LoginScreen后,您不需要创建vm:LoginScreenViewModel
的新对象,并将其分配给查看。
答案 1 :(得分:0)
从视图模型中实例化视图可能会更好。在CurrentView内容控件所在的位置实例化视图模型,并将Content属性设置为视图模型中包含的视图。这样,每次切换视图时都不会重新创建它们。