DataContext绑定

时间:2016-02-12 16:42:58

标签: c# wpf xaml mvvm datacontext

我所拥有的是三种不同的观点。我有每个视图的视图模型。我所做的是将视图的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而不是后面的代码中的新实例?

2 个答案:

答案 0 :(得分:1)

我觉得你在这里有点困惑。您无需明确为DataContext(s)创建views。在ViewModel定义您的观看后,它也会传递给View,因为它DataContext

  

请勿明确指定DataContext并尝试检查   加载后的视图的DataContext。这将是ViewModel   这实际上导致view加载。

例如如果您的视图为LoginScreen,则您的DataContext将为vm:LoginScreenViewModel。加载LoginScreen后,您不需要创建vm:LoginScreenViewModel的新对象,并将其分配给查看。

答案 1 :(得分:0)

从视图模型中实例化视图可能会更好。在CurrentView内容控件所在的位置实例化视图模型,并将Content属性设置为视图模型中包含的视图。这样,每次切换视图时都不会重新创建它们。