重新创建元素上的所有绑定(或自定义绑定标记扩展?)

时间:2014-01-10 18:07:07

标签: .net wpf

我面临的问题在于,当应用绑定的元素改变其在可视树中的位置时,使用RelativeSource的绑定不会更新其目标。

所以,如果有一个代码片段:

<Border Tag="Border1">
  <TextBlock Text="{Binding Path=Tag, RelativeSource={RelativeSource AncestorType=Border}}" />
</Border>

<Border Tag="Border2" />

然后尝试从第一个TextBlock中移除Border并将其添加到第二个TextBlock将不会导致Text更改其UpdateTarget值。

我能想到的最简单的解决方法是重新创建使用RelativeSource的所有绑定并应用于元素的子树(简单地调用ClearBinding没有用)。有人知道怎么会这样做吗? 调用SetBinding - BindingBase很简单,但是如何查找需要重新创建的所有依赖项属性?我找不到可靠地收集对象的所有依赖属性(包括附加)的方法。

另一种理论上可行的方法是子类Visual,因此它将跟踪实际源路径中的{{1}}元素。虽然我很确定会有一些内部密封的东西阻止完成这个。

欢迎任何想法和替代解决方案。

1 个答案:

答案 0 :(得分:0)

如果您可以更改边框的DataContext,并且在TextBox中使用绑定到继承的DataContext,则应该有效:

   <Border x:Name="b1" 
           Tag="Border1"
           DataContext="{Binding RelativeSource={RelativeSource Self}}">
        <TextBlock Text="{Binding Tag}" />
    </Border>

    <Border x:Name="b2" 
            Tag="Border2" 
            DataContext="{Binding RelativeSource={RelativeSource Self}}"/>