Wpf FrameworkElement的DataContext属性不继承元素树
你好,WPF专业人士,至少我希望你们中的一些人能读到这篇文章 DataContext是FrameworkElement(所有WPF控件的基类)上的属性,并作为DependencyProperty实现。这意味着逻辑树中的所有子元素共享相同的DataContext 那么ContentControl应该用它的子元素来完成吗? 我有一个场景,那是而不是的情况,我想知道这种不当行为的原因是什么 如果你对它有了更多的了解,请阅读这篇文章(不想在这里复制所有内容),从哪里开始出现问题…: 简而言之,ContentControl中我的DataTemplates确实有一个死DataContext,这意味着没有任何东西可以绑定到它,这实际上是不可能的 ContentControl中的每个元素在DataContext属性中都没有设置 DataContext是上的一个属性 FrameworkElement(所有 WPF控制),并作为 从属财产。这意味着所有的 逻辑系统中的子元素 树共享相同的数据上下文 它是一个依赖属性的事实并不意味着继承。。。对于Wpf FrameworkElement的DataContext属性不继承元素树,wpf,datacontext,inheritance,frameworkelement,Wpf,Datacontext,Inheritance,Frameworkelement,你好,WPF专业人士,至少我希望你们中的一些人能读到这篇文章 DataContext是FrameworkElement(所有WPF控件的基类)上的属性,并作为DependencyProperty实现。这意味着逻辑树中的所有子元素共享相同的DataContext 那么ContentControl应该用它的子元素来完成吗? 我有一个场景,那是而不是的情况,我想知道这种不当行为的原因是什么 如果你对它有了更多的了解,请阅读这篇文章(不想在这里复制所有内容),从哪里开始出现问题…: 简而言之,Cont
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来显示其内容,从而导致无限嵌套…这可以稍微简化为