数据上下文绑定

DataContext binding

我有三种不同的看法。我有每个视图的视图模型。我所做的是将视图的数据上下文设置为相应视图模型的新实例,其工作方式如下所示:

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

这可以正常工作。一切都正确绑定等等。

现在,我将每个视图都设置为用户控件。我的 Window 每个视图都有数据模板,如下所示:

<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>

这允许我在 window 的视图模型中创建视图模型,将它们设置为 CurrentView,并且与该视图模型关联的视图显示在 window 中。这一切都正常工作。

我的问题是,如果我切换视图,存储在视图的 ViewModel 中的所有信息都会被破坏。我的问题是,如何将每个视图的数据上下文绑定到创建它的视图模型,而不是绑定到后面代码中的新实例?

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

我觉得你在这里有点困惑。您不需要明确地为您的 views 创建 DataContext(s)。当您的 ViewModel 定义您的视图时,它也会传递给您的 View,因为它是 DataContext

Don't assign a DataContext explicitly and try check the DataContext of a view after it is loaded. It will be the ViewModel that actually caused the view to load.

例如 如果您的视图是 LoginScreen,您的 DataContext 将是 vm:LoginScreenViewModel。加载 LoginScreen 后,您无需创建 vm:LoginScreenViewModel 的新对象并将其分配给视图。