Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf FrameworkElement的DataContext属性不继承元素树_Wpf_Datacontext_Inheritance_Frameworkelement - Fatal编程技术网

Wpf FrameworkElement的DataContext属性不继承元素树

Wpf FrameworkElement的DataContext属性不继承元素树,wpf,datacontext,inheritance,frameworkelement,Wpf,Datacontext,Inheritance,Frameworkelement,你好,WPF专业人士,至少我希望你们中的一些人能读到这篇文章 DataContext是FrameworkElement(所有WPF控件的基类)上的属性,并作为DependencyProperty实现。这意味着逻辑树中的所有子元素共享相同的DataContext 那么ContentControl应该用它的子元素来完成吗? 我有一个场景,那是而不是的情况,我想知道这种不当行为的原因是什么 如果你对它有了更多的了解,请阅读这篇文章(不想在这里复制所有内容),从哪里开始出现问题…: 简而言之,Cont

你好,WPF专业人士,至少我希望你们中的一些人能读到这篇文章

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

那么ContentControl应该用它的子元素来完成吗?

我有一个场景,那是而不是的情况,我想知道这种不当行为的原因是什么

如果你对它有了更多的了解,请阅读这篇文章(不想在这里复制所有内容),从哪里开始出现问题…:

简而言之,ContentControl中我的DataTemplates确实有一个死DataContext,这意味着没有任何东西可以绑定到它,这实际上是不可能的

ContentControl中的每个元素在DataContext属性中都没有设置

DataContext是上的一个属性 FrameworkElement(所有 WPF控制),并作为 从属财产。这意味着所有的 逻辑系统中的子元素 树共享相同的数据上下文

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

所以ContentControl应该这样做 它的后代元素对吗

ContentControl
有点特殊:其子体的
DataContext
(从
DataTemplate
构建的可视化树)实际上是
ContentControl
内容。因此,如果您的
ContentControl
没有内容,则其中的
DataContext
为空。

这对我来说很有效:

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

没有
Content=“{Binding}”
,DataContext是空的

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

我想根据viewmodel中属性的值显示usercontrol。所以我制作了一个带有一些样式触发器的ContentControl。根据绑定属性的值,触发器设置包含特定usercontrol的特定ContentTemplate

usercontrol显示正确,但其DataContext始终为null。因此,我必须将ContentControl的上下文设置为:
Content=“{Binding}”
,此后,UserControl工作正常,并且与其父控件具有相同的DataContext

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

在参考资料部分,我定义了两个数据模板;我想显示的每个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>

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

将设置为ContentControl内容的控件:

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

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

<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>


我希望这对我之前的回答有帮助。

我的ContentControl有一个类似于PersonListViewModel的DataContext,但问题似乎是ContentPresenter的一个节点及其内容属性没有设置,因此DataContext也没有设置。好的,我理解你的答案,尽管我觉得这听起来还是有点奇怪。因此,梅莱克给我的解决方案实际上并没有解决办法,而是他唯一能/必须做的事情。关于此问题的任何其他解决方案/意见?您的ContentControl有DataContext,但它有内容吗?使用Snoop的ContentControl中没有“Content”属性。在XAML中有??下面的一个节点是ContentPresenter,其内容属性为空。默认情况下,Snoop不显示设置为默认值的属性,您可以使用“D”按钮显示这些属性。无论如何,这可能意味着内容为空,这解释了为什么在descendants@ardave,我的猜测是,如果是这样,它将导致隐式数据模板的嵌套问题。例如,假设您有一个类型X的DataTemplate(在参考资料中声明,类型X作为键,因此它会在ContentControls中自动拾取),并且DataTemplate包含一个ContentControl。如果未在此ContentControl上设置内容,并且DataContext作为内容继承,则此ContentControl将使用相同的DataTemplate来显示其内容,从而导致无限嵌套…这可以稍微简化为