Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 在元素上重新创建所有绑定(或自定义绑定标记扩展?)_.net_Wpf - Fatal编程技术网

.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。