C# 为什么将绑定数据上下文设置为控件';什么是数据上下文?
我有一个名为“CardDisplay”的用户控件,它具有一个名为“CardValue”的公开依赖属性。控件本身基本上只是一个绑定到此属性的textblock(实际上是一个图像,但它与textblock一起工作并且更易于显示),如下所示:C# 为什么将绑定数据上下文设置为控件';什么是数据上下文?,c#,xaml,data-binding,windows-store-apps,windows-8.1,C#,Xaml,Data Binding,Windows Store Apps,Windows 8.1,我有一个名为“CardDisplay”的用户控件,它具有一个名为“CardValue”的公开依赖属性。控件本身基本上只是一个绑定到此属性的textblock(实际上是一个图像,但它与textblock一起工作并且更易于显示),如下所示: <UserControl> <Grid> <TextBlock Text="{Binding CardValue}"/> </Grid> </UserControl> “2”按
<UserControl>
<Grid>
<TextBlock Text="{Binding CardValue}"/>
</Grid>
</UserControl>
“2”按预期显示在控件中。但是,如果我将该行更改为
<local:CardDisplay CardValue="{Binding CurrentCard}"/>
没有显示任何内容,我得到一个绑定异常,表示在类型“DisplayCard”上找不到“CurrentCard”。显然,它不应该查看显示卡,它应该查看父级的数据上下文(当然,它有一个名为“CurrentCard”的属性)
切换到“ElementName”绑定可以按预期工作:
<TextBock x:Name="HiddenText" Text="{Binding CurrentCard}"/>
<local:CardDisplay CardValue="{Binding Path=Text, ElementName=HiddenText}"/>
基本上,我不知道为什么我的装订突然停止寻找正确的位置。在简单的数据模板中也可以看到相同的行为:
<DataTemplate x:Key="CardTemplate">
<Image Source="{Binding Converter={StaticResource IntToImgSourceConverter}"/>
</DataTemplate>
<ContentPresenter ContentTemplate="{StaticResource CardTemplate}" Content="{Binding CurrentCard}"/>
将引发绑定异常,表示在“int”类型上找不到名为“CurrentCard”的属性
为什么父级绑定要在子级的数据上下文中查找属性?从子修复中删除数据上下文(绑定再次按预期工作),但似乎没有必要这样做
编辑:
需要明确的是,在设置数据上下文之后,绑定DP基本上是无用的。如果我的绑定是正确的,那么让它使用父级数据上下文的最佳方法是什么?我想到的用例是让它工作:
<ItemsControl ItemsSource={Binding PlayerHand}>
<ItemsControl.ItemTemplate>
<DataTemplate>
<local:CardDisplay CardValue="{Binding Path=CardValue}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
这种绑定:
<local:CardDisplay CardValue="{Binding CurrentCard}"/>
因为这个与当前的DataContext
无关。它显式地将元素设置为绑定源,而不是当前的DataContext
<local:CardDisplay CardValue="{Binding CurrentCard}"/>
<local:CardDisplay CardValue="{Binding Path=Text, ElementName=HiddenText}"/>