wpf - WPF 中的 DataTemplate 和 DataContext 有什么区别?

标签 wpf wpf-controls binding

我可以通过以下 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/

相关文章:

ItemsControl 内 DataTemplate 中的 WPF UserControl - 如何绑定(bind)到 ItemsSource 的父级

wpf - 如何在按钮的 CommandParam 中传递特定的 View 模型对象?

c# - 动态设置工具提示宽度和高度

WPF 优化 UI 线程上的加载

c# - WPF ComboBox 数据绑定(bind) xaml 与代码

c# - 错误 :The ObjectContext instance has been disposed and can no longer be used for operations that require a connection

wpf - 如何防止使用控件模板创建的 WPF 自定义控件围绕自身绘制焦点?

wpf - 使用 WindowsFormsHost 托管控件的 ElementHost 托管 WPF View 的键盘焦点导航问题

javascript - Knockout绑定(bind)错误,无法在iFrame内绑定(bind)viewModel

WPF 绑定(bind) StringFormat 语法