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

据我了解……

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

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

  1. DataContext数据流入UI,
  2. Content属性的工作是确定(通常是一个绑定)将显示的内容(通过ContentPresenter + ContentTemplate)

示例代码

      

参考

  • MSDN: ContentControl.Content属性
  • MSDN: FrameworkElement.DataContext属性
  • MSDN: WPF内容模型
    • 值得阅读
  • StackOverflow: 什么是DataContext?

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

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

Content更加具体:

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