10

你好 WPF 专业人士至少我希望你们中的一些人读到这个!

DataContext 是 FrameworkElement(所有 WPF 控件的基类)上的属性,并作为 DependencyProperty 实现。这意味着逻辑树中的所有后代元素共享相同的 DataContext。

所以 ContentControl 应该用它的后代元素来做吗?

我有一个情况并非如此,我想知道这种不当行为的原因是什么?!

如果您对它有更多了解,请阅读问题开始的这个线程(不想在这里复制所有内容)......:

WPF:找不到触发目标“cc”。目标必须出现在任何 Setter、Triggers 之前

简而言之:我在 ContentControl 中的 DataTemplates 确实有一个死的 DataContext 这意味着没有什么可以绑定到它,实际上是不可能的......

ContentControl 下方的每个元素都没有在 DataContext 属性中设置任何内容???

4

4 回答 4

23

DataContext 是 FrameworkElement(所有 WPF 控件的基类)上的属性,并作为 DependencyProperty 实现。这意味着逻辑树中的所有后代元素共享相同的 DataContext。

它是一个依赖属性的事实并不意味着继承......它是正确的DataContext,但只是因为依赖属性FrameworkPropertyMetadataOptions.Inherits在其元数据中有标志。

所以 ContentControl 应该用它的后代元素来做吗?

ContentControl有点特别:DataContext它的后代(由 构建的视觉树DataTemplate)实际上ContentContentControl. 因此,如果您ContentControl没有内容,则其DataContext内部为空。

于 2010-12-18T22:25:45.910 回答
15

这对我有用:

<ContentControl ContentTemplate="{StaticResource NotesTemplate}"
                Content="{Binding}"
                DataContext="{Binding HeightField}"/>

没有Content="{Binding}",DataContext 为 NULL

于 2012-10-09T19:24:39.387 回答
0

在阅读了这个问题和以前的答案之后,我更喜欢使用 ContentControl 和数据触发的内容,如下所示:

将被设置为 ContentControl 内容的控件:

<TextBox x:Key="ViewA">
   ...
</TextBox>
<ComboBox x:Key="ViewB">
   ...
</ComboBox>

ContentControl 通过 DataTrigger 在 ContentControl 样式中切换自己的内容:

<ContentControl>
  <ContentControl.Style>
    <Style>
        <Style.Triggers>
            <DataTrigger Binding="{Binding Path=Property}" Value="0">
                <Setter Property="Content" Value="{StaticResource ViewA}" />
            </DataTrigger>
            <DataTrigger Binding="{Binding Path=Property}" Value="1">
                <Setter Property="Content" Value="{StaticResource ViewB}" />
            </DataTrigger>
        </Style.Triggers>
    </Style>
  </ContentControl.Style>
</ContentControl>

我希望这对像以前对我的回答一样的人有所帮助。

于 2014-09-04T13:39:06.713 回答
0

最后一个答案(来自 VinceF)也对我有用。

我想根据我的视图模型中的属性值显示一个用户控件。所以我用一些样式触发器制作了一个 ContentControl。根据绑定属性的值,触发器设置包含特定用户控件的特定 ContentTemplate。

用户控件显示正确,但其 DataContext 始终为空。所以我必须将 ContentControl 的 Context 设置为:Content="{Binding}"之后,UserControls 工作正常,并且与它们的父级具有相同的 DataContext。

所以我的 XAML 看起来像这样:

在参考资料部分,我定义了两个 DataTemplate;我要显示的每个 UserControl 的每个。

<DataTemplate x:Key="ViewA">
    <namespace:UserControlA/>
</DataTemplate>
<DataTemplate x:Key="ViewB">
    <namespace:UserControlB/>
</DataTemplate>

我根据属性显示 UserControl 的部分如下:

<ContentControl Content="{Binding}">
    <ContentControl.Style>
        <Style>
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=Property}" Value="0">
                    <Setter Property="ContentControl.ContentTemplate" Value="{StaticResource ViewA}" />
                </DataTrigger>
                <DataTrigger Binding="{Binding Path=Property}" Value="1">
                    <Setter Property="ContentControl.ContentTemplate" Value="{StaticResource ViewB}" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ContentControl.Style>
</ContentControl>
于 2013-12-04T18:17:04.863 回答