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

标签 .net wpf

我面临的问题在于使用 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/

相关文章:

c# - 如何解决 Xamarin.Android Java 互操作的缓慢问题

c# - 具有多个范围的 HTTP 请求

c# - 如何从 ResourceDictionary 引用 BindingProxy 实例

c# - 在 .NET Core 3.0 中加载 exe 时出现错误的 IL 格式

wpf - 免费 WPF 轮播实现

.net - 从 NHibernate 生成数据库模式脚本

c# - 为什么 BackgroundWorker 在对委托(delegate)调用 BeginInvoke 时不需要调用 EndInvoke?

.net - WinUI3 应用程序抛出异常 - 我错过了什么?

c# - 查看模型,模型在哪里实现 INotifyPropertyChanged

c# - 有没有一种简单的方法可以使用 ScrollViewer 在 ContentPresenter 中计算位图图像上的鼠标坐标?