我面临的问题在于,当应用绑定的元素改变其在可视树中的位置时,使用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}}元素。虽然我很确定会有一些内部密封的东西阻止完成这个。
欢迎任何想法和替代解决方案。
答案 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}}"/>