-1

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

我说的是在模板内有一个 ContentControl 而不像这样设置 Content Content = {TemplateBinding prop}

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

在我看来,我现在对 ContentControl 的了解都是垃圾呵呵。

有任何想法吗?

提前谢谢各位。

4

2 回答 2

3

除了@nit 所说, a 的内容ContentControl没有内部自我连接。相反,它们通常在其他控件中使用,其中它们的Content属性是绑定到父控件属性的数据......这可能使它看起来自动工作:

<ControlTemplate x:Key="DataGridCellWrapTemplate" TargetType="{x:Type DataGridCell}">
    <Border Name="DataGridCellBorder">
        <ContentControl Content="{TemplateBinding Content}" />
    </Border>
</ControlTemplate>

在这种情况下,ContentControl.Content属性是绑定到属性的内部数据DataGridCell.Content。这意味着设置为Contentof 的任何内容DataGridCell都将显示在 this 中ContentControl

您可以将 aContentControl视为“数据持有者”,尽管这不一定是数据绑定数据。我们(大部分)习惯于创建DataTemplates 来定义我们的集合控件中的数据对象应该是什么样子。您可以将其想象为ContentControl集合中的每个项目都有一个。

从这里开始,这意味着如果可以使用 aDataTemplate来定义每个集合项的外观,我们还可以使用 one 来定义 a 中的单个项的ContentControl外观:

<ContentControl Content="{Binding SomeDataObject}" 
    ContentTemplate="{StaticResource SomeDataTemplateToDefineWhatTheDataLooksLike}" />

当然,如果我们声明了DataTemplate相关类型的 a 而没有设置x:Key属性,那么我们可以省略ContentTemplate属性的设置。因此ContentControl,这对于使用相同的 显示集合中的一个项目很有用DataTempate

为了解决您的评论,那将是因为StyleaContentControl使用的“有限默认值”。有关更多信息,我建议您查看 MSDN 上的ContentControl Class页面...从该页面:

ContentControl 具有有限的默认样式。如果要增强控件的外观,可以创建一个新的 DataTemplate。

于 2013-09-20T10:12:17.537 回答
1

ContentContentControl总是在外部设置,或者像静态一样

<ContentControl Content="MyContent"/>

或通过绑定

<ContentControl Content="{Binding Name}"/>

在后一种情况下,DataContext如果未明确设置,则会在其中搜索内容。因此,如果 Content 绑定在 DataContext 中,则 DataContext 更改将被反映,否则不会。

设置 DataContext 并不意味着 Content 会自动设置

于 2013-09-20T09:48:10.940 回答