我有一个名为“CardDisplay”的用户控件,其中包含一个名为“CardValue”的公开依赖项属性。控件本身基本上只是一个文本块(图像真的,但它适用于文本块,并且更容易显示)绑定到此属性,如下所示:
<UserControl>
<Grid>
<TextBlock Text="{Binding CardValue}"/>
</Grid>
</UserControl>
为简单起见,数据上下文在代码隐藏中设置为this
,尽管它也适用于标准视图模型。这样可以正常使用,如果你这样使用它:
<local:CardDisplay CardValue="2"/>
“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>
答案 0 :(得分:3)
这种约束力:
<local:CardDisplay CardValue="{Binding CurrentCard}"/>
表示从绑定源电流CurrentCard
绑定到路径DataContext
。由于您在代码隐藏中设置了UserControl的DataContext
,因此它不会继承父DataContext
,因此会出现绑定错误。仅当您未在子级别设置时,DataContext
才会从父级DataContext
继承。
另一方面,这种绑定工作正常:
<local:CardDisplay CardValue="{Binding Path=Text, ElementName=HiddenText}"/>
因为这个与当前DataContext
无关。它明确地将元素设置为绑定源而不是当前DataContext
。