数据上下文绑定
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
的新对象并将其分配给视图。
我有三种不同的看法。我有每个视图的视图模型。我所做的是将视图的数据上下文设置为相应视图模型的新实例,其工作方式如下所示:
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 theDataContext
of a view after it is loaded. It will be theViewModel
that actually caused theview
to load.
例如 如果您的视图是 LoginScreen
,您的 DataContext 将是 vm:LoginScreenViewModel
。加载 LoginScreen 后,您无需创建 vm:LoginScreenViewModel
的新对象并将其分配给视图。