我面临的问题在于使用 RelativeSource
的绑定(bind)。当绑定(bind)应用到的元素更改其在可视树中的位置时,不会更新其目标。
因此,如果有以下代码片段:
<Border Tag="Border1">
<TextBlock Text="{Binding Path=Tag, RelativeSource={RelativeSource AncestorType=Border}}" />
</Border>
<Border Tag="Border2" />
然后尝试删除
TextBlock
从第一个 Border
并将其添加到第二个不会导致 TextBlock
改变其Text
值(value)。我能想到的最简单的解决方法是重新创建所有使用 RelativeSource 并应用于元素子树的绑定(bind)(简单地调用
UpdateTarget
没有好处)。有谁知道如何做到这一点?调用
ClearBinding
- SetBinding
很容易,但是如何找到所有需要重新创建的依赖属性?我找不到可靠地收集对象(包括附加)的所有依赖项属性的方法。另一种理论上可能的方法是子类
BindingBase
因此它将跟踪 Visual
到实际源的路径中的元素。虽然我很确定有一些内部密封的东西阻止了这一点。欢迎任何想法和替代解决方案。
最佳答案
如果可以更改 DataContext
你的边界和TextBox
使用绑定(bind)到继承的 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}}"/>
关于.net - 重新创建元素上的所有绑定(bind)(或自定义绑定(bind)标记扩展?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21051336/