我可以通过以下 DataContext
语法设置 View 模型和 View 之间的关系:
<UserControl.DataContext>
<view_model:MainMenuModel />
</UserControl.DataContext>
我还可以通过以下 DataTemplate
语法设置 View 模型和 View 之间的关系:
<DataTemplate
DataType="{x:Type viewModel:UserViewModel}">
<view:UserView />
</DataTemplate>
两者有什么区别?是第二个XAML没有设置 View 的数据上下文?
最佳答案
您的第二个 XAML 定义了一个模板,可用于显示 viewModel:UserViewModel
类型的对象。它不会设置任何数据,但如果要求 ContentPresenter
显示该类型的对象,它将使用您的模板。
您的第一个 XAML 正在设置控件的 DataContext
属性。它定义您在该范围内执行的任何绑定(bind)都将使用 DataContext 作为绑定(bind)的根(除非显式覆盖)。对于 DataContext
工作的简单示例,请比较这两个(两者都假设“s”是 System
命名空间):
<StackPanel>
<TextBlock Text="{Binding Day, Source={x:Static s:DateTime.Now}}" />
<TextBlock Text="{Binding Month, Source={x:Static s:DateTime.Now}}" />
<TextBlock Text="{Binding Year, Source={x:Static s:DateTime.Now}}" />
</StackPanel>
<StackPanel DataContext="{Binding Source={x:Static s:DateTime.Now}}">
<TextBlock Text="{Binding Day}" />
<TextBlock Text="{Binding Month}" />
<TextBlock Text="{Binding Year}" />
</StackPanel>
两个 StackPanels
将呈现相同的效果,但第二个更容易重用。 (例如:如果您想显示不同的日期,则只需更改一处的绑定(bind)即可。)
关于wpf - WPF 中的 DataTemplate 和 DataContext 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2407917/