在属性节点

时间:2015-11-01 18:28:25

标签: c# wpf xaml

我试图像这样绑定

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

请问有什么问题?

2 个答案:

答案 0 :(得分:2)

为此,Foo对象需要成为TempUserControl的逻辑子对象。 FrameworkElement(和FrameworkContentElement)为此提供了两种方法:AddLogicalChildRemoveLogicalChild

因此,在TempUserControl中,为Foo依赖项属性注册一个属性更改的回调。然后,该回调可以将旧值和新值传递给实例方法,该方法使用旧值调用RemoveLogicalChild,使用新值调用AddLogicalChild。请注意,Foo必须从FrameworkElementFrameworkContentElement继承,否则它将不会包含在逻辑树中。

答案 1 :(得分:1)

我发现这在某些情况下也不起作用,我不能100%肯定为什么(我有猜测)。但是你可以通过给你的TempUserControl一个x:Name并使用ElementName而不是RelativeSource来解决它。