DataContext and ContentControl



我一直认为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 类页面...从该页面:

内容控件具有有限的默认样式。如果要增强控件的外观,可以创建新的数据模板。

ContentControlContent总是在外部静态设置,就像

<ContentControl Content="MyContent"/>

或通过绑定

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

在以后的情况下,如果未显式设置,则会在DataContext内搜索内容。因此,如果内容绑定在 DataContext 中,则 DataContext 更改将反映,否则不会。

设置

数据上下文并不意味着将设置内容 自然而然

最新更新