DataContext和ContentControl

时间:2013-09-20 09:43:50

标签: wpf

我一直认为ControlControl必须监听DataContextChanged,然后设置this.Content = this.DataContext,但现在我设法反映了ContentControl的源代码,我无法找到内容设置的位置。

我说的是在模板中设置ContentControl而不设置像Content = {TemplateBinding prop}这样的内容。

有人知道ContentControl的工作原理吗?内容如何在内部设置?

现在在我看来,我所知道的关于ContentControl的一切都是垃圾嘿嘿。

有什么想法吗?

先谢谢你们。

2 个答案:

答案 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属性。这意味着,ContentDataGridCell的{​​{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并不意味着将设置内容   自动