WPF:Content和DataContext属性之间有什么区别?
据我了解……
- DataContext属性
- “控件使用此属性作为数据源”
- “是每个框架元素具有的属性,可用于将数据流入屏幕”
- “DataContext具有范围”
- “范围是根据DataContext在对象树中的分配位置建立的”
- “如果在父元素(例如Window)上设置DataContext,该属性将向下流向所有子元素(例如文本框)”
- 内容属性
- 此属性具有许多名称,具体取决于正在使用的控件:
- ContentControl.Content
- ItemsControl.ItemsSource
- Items.ItemsSource
- HeaderedContentControl.Header
- HeaderedContentControl.Content
- 此属性具有许多名称,具体取决于正在使用的控件:
所以我的问题是: Content
和DataContext
属性之间有什么区别 ? 这里有一个我很遗憾的细微差别。 是吗…
-
DataContext
数据流入UI, -
Content
属性的工作是确定(通常是一个绑定)将显示的内容(通过ContentPresenter + ContentTemplate)
示例代码
参考
- MSDN: ContentControl.Content属性
- MSDN: FrameworkElement.DataContext属性
- MSDN: WPF内容模型
- 值得阅读
- StackOverflow: 什么是DataContext?
DataContext
是WPF中的一个更通用的function,正如它由低级FrameworkElement类的所有权所暗示的那样。
- 它参与所有框架元素的绑定,作为默认绑定源。
- 正如您所提到的,元素的DataContext传递给子元素。
Content
更加具体:
- 它是一个特定于一组非常有限的控件的依赖属性(大多数是从
ContentControl
inheritance的控件 – 其他控件如ListBox
本身不拥有Content属性,但在其控件模板中的某处使用 ContentControl)。 - 它不像DataContext那样传递,而是仅仅关注拥有Control及其直接关系(即绑定)
- 它被控件使用,它控制要显示的东西,控件本身不知道或关心将是什么类型的对象。
- 它通常与
ContentTemplate
结合使用 – 也就是说,Content是要显示的内容,ContentTemplate是如何显示它。 (Button
就是一个很好的例子。)