.net 在元素上重新创建所有绑定(或自定义绑定标记扩展?)
我面临的问题在于,当绑定应用到的元素更改其在可视树中的位置时,使用.net 在元素上重新创建所有绑定(或自定义绑定标记扩展?),.net,wpf,.net,Wpf,我面临的问题在于,当绑定应用到的元素更改其在可视树中的位置时,使用RelativeSource的绑定不会更新其目标元素 因此,如果有以下代码片段: <Border Tag="Border1"> <TextBlock Text="{Binding Path=Tag, RelativeSource={RelativeSource AncestorType=Border}}" /> </Border> <Border Tag="Border2" />
RelativeSource
的绑定不会更新其目标元素
因此,如果有以下代码片段:
<Border Tag="Border1">
<TextBlock Text="{Binding Path=Tag, RelativeSource={RelativeSource AncestorType=Border}}" />
</Border>
<Border Tag="Border2" />
然后,尝试从第一个边框中删除TextBlock
并将其添加到第二个边框中不会导致TextBlock
更改其Text
值
我能想到的最简单的解决方法是重新创建所有使用RelativeSource并应用于元素子树的绑定(简单地调用UpdateTarget
没有好处)。有人知道怎么做吗?
调用ClearBinding
-SetBinding
非常简单,但是如何找到所有需要重新创建的依赖属性呢?我找不到可靠地收集对象(包括附加对象)的所有依赖项属性的方法
另一种理论上可能的方法是将BindingBase
子类化,因此它将跟踪实际源路径中的可视
元素。虽然我很确定有一些内部密封的东西阻止了这一点
欢迎任何想法和替代解决方案。如果您可以更改边框的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}}"/>
我很好奇为什么要这样移动可视化树中的元素。呃,我正在构建PropertyGrid控件,其中属性编辑器只创建一次,但它所在的容器可以由父级ItemsControl
重新创建(在用户重新选择对象的情况下)。当前编辑器是控件
(与viewmodel+相应的数据模板
相反)。佩哈普斯,我可以改变这一点,但这不是一个容易的改变(在我看来,在WPF中,无论出于何种目的使用标记
属性都是一种黑客行为。当然,有几种更好的机制可以将某个UI元素与任何给定的数据(附加属性、数据绑定等)相关联。)而不是使用标记
属性。这只是一个例子……是的,如果您停下来想一想,在使用虚拟化
项控件时,需要将项的数据持久化到ViewModel或Model中。由于UI正在动态地被销毁/重新创建/回收到不同的数据项中,因此您不能相信它会这样做ep数据的状态。因此您需要一个VM。