WPF:Content和DataContext属性之间有什么区别?

时间:2014-02-13 22:56:20

标签: c# .net wpf

据我所知......

  • DataContext 属性
    • “控件将此属性用作数据源”
    • “是每个框架元素都具有的属性,可用于将数据流入屏幕”
    • “DataContext具有范围”
    • “范围是根据DataContext在对象树中的分配位置”
    • 建立的
    • “如果您在父元素(例如窗口)上设置DataContext,该属性将向下流向所有子元素(例如文本框)”
  • 内容属性
    • 此属性具有许多名称,具体取决于正在使用的控件:
      • ContentControl.Content
      • ItemsControl.ItemsSource
      • Items.ItemsSource
      • HeaderedContentControl.Header
      • HeaderedContentControl.Content

所以我的问题是: ContentDataContext属性之间有什么区别?这里有一个我很遗憾的细微差别。是吗......

  1. DataContext将数据流入用户界面时,
  2. Content属性的作用是确定(通常是一个绑定)将显示的内容(通过ContentPresenter + ContentTemplate)
  3. 示例代码

    <Window x:Name="myWindow" DataContext="{Binding ClassA}> 
        <StackPanel> <!-- DataContext is set to ClassA -->
    
            <!-- DataContext is set to ClassA, ClassA.Name will be displayed -->
            <Label Content="{Binding Name}" />
        </StackPanel>
     </Window>
    

    参考

1 个答案:

答案 0 :(得分:5)

DataContext是WPF中的一个更通用的功能,正如它由低级FrameworkElement类的所有权所暗示的那样。

  • 它参与所有框架元素的绑定,作为默认绑定源。
  • 正如您所提到的,元素的DataContext传递给子元素。

Content更具体:

  • 它是一个特定于一组非常有限的控件的依赖属性(大多数是从ContentControl继承的控件 - 其他控件如ListBox本身不拥有Content属性,但是在其控件模板中的某处使用 ContentControl。)
  • 它不像DataContext那样传递,而是仅仅关注拥有Control及其直接关系(即绑定)
  • 控件使用它来调用要显示的内容,控件本身不知道或关心将是什么类型的对象。
  • 它经常与ContentTemplate结合使用 - 也就是说,Content是要显示的,而ContentTemplate是 显示它的方式。 (Button就是一个很好的例子。)