我一直认为ControlControl一定是在监听DataContextChanged然后设置this.Content = this.DataContext
但现在我设法反映了ContentControl的源代码,我找不到设置内容的位置。
我说的是模板中有一个内容控件,而无需像这样设置内容Content = {TemplateBinding prop}
。
有谁知道ContentControl是如何工作的?内容如何在内部设置?
现在在我看来,我对ContentControl的了解都是垃圾,呵呵。
有什么想法吗?
提前感谢伙计们。
补充@nit所说的,ContentControl
的内容没有内部的自我联系。相反,它们通常在其他控件中使用,其中它们的Content
属性是绑定到父控件属性的数据...这可能会使其看起来自动工作:
<ControlTemplate x:Key="DataGridCellWrapTemplate" TargetType="{x:Type DataGridCell}">
<Border Name="DataGridCellBorder">
<ContentControl Content="{TemplateBinding Content}" />
</Border>
</ControlTemplate>
在这种情况下,ContentControl.Content
属性在内部绑定到 DataGridCell.Content
属性的数据。这意味着设置为DataGridCell
Content
的任何内容都将显示在此ContentControl
中。
您可以将ContentControl
视为"数据持有者",尽管这不一定是数据绑定数据。我们(主要)习惯于创建DataTemplate
来定义集合控件中的数据对象应该是什么样子。您可以将其视为集合中每件物品都有一个ContentControl
。
接下来,这意味着如果可以使用DataTemplate
来定义每个集合项的外观,我们也可以使用一个来定义ContentControl
中的单个项的外观:
<ContentControl Content="{Binding SomeDataObject}"
ContentTemplate="{StaticResource SomeDataTemplateToDefineWhatTheDataLooksLike}" />
当然,如果我们在没有设置 x:Key
属性的情况下声明了相关类型的DataTemplate
,那么我们可以省略 ContentTemplate
属性的设置。因此,该ContentControl
对于显示使用相同DataTempate
的集合中的一个项目非常有用。
为了解决您的评论,这是因为ContentControl
使用的"有限默认Style
"。有关详细信息,我建议您查看 MSDN 上的 ContentControl 类页面...从该页面:
内容控件具有有限的默认样式。如果要增强控件的外观,可以创建新的数据模板。
ContentControl
的Content
总是在外部静态设置,就像
<ContentControl Content="MyContent"/>
或通过绑定
<ContentControl Content="{Binding Name}"/>
在以后的情况下,如果未显式设置,则会在DataContext
内搜索内容。因此,如果内容绑定在 DataContext 中,则 DataContext 更改将反映,否则不会。
设置数据上下文并不意味着将设置内容 自然而然