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