我试图像这样绑定
<local:TempUserControl>
<local:TempUserControl.Foo>
<local:Foo Name2="{Binding Path=Name, RelativeSource={RelativeSource AncestorType={x:Type local:TempUserControl}}}"/>
</local:TempUserControl.Foo>
</local:TempUserControl>
并收到错误
无法找到与引用&#39; RelativeSource绑定的源代码 FindAncestor,AncestorType =&#39; WpfApplication1.TempUserControl&#39;, AncestorLevel =&#39; 1&#39;&#39 ;. BindingExpression:路径=名称;的DataItem = NULL;目标 元素是&#39; Foo&#39; (名称=&#39;&#39);目标属性是&#39; Name2&#39; (键入&#39; String&#39;)
请问有什么问题?
答案 0 :(得分:2)
为此,Foo
对象需要成为TempUserControl
的逻辑子对象。 FrameworkElement
(和FrameworkContentElement
)为此提供了两种方法:AddLogicalChild
和RemoveLogicalChild
。
因此,在TempUserControl
中,为Foo
依赖项属性注册一个属性更改的回调。然后,该回调可以将旧值和新值传递给实例方法,该方法使用旧值调用RemoveLogicalChild
,使用新值调用AddLogicalChild
。请注意,Foo
必须从FrameworkElement
或FrameworkContentElement
继承,否则它将不会包含在逻辑树中。
答案 1 :(得分:1)
我发现这在某些情况下也不起作用,我不能100%肯定为什么(我有猜测)。但是你可以通过给你的TempUserControl一个x:Name并使用ElementName而不是RelativeSource来解决它。