2011-06-14 58 views

回答

2

这取决于真实情况,正如H.B.指出,但即使在“简单”情况下也会非常密集。

在你的例子中,假设你可以得到绑定,你可以检查Path属性,看它是否引用你的“Foo”属性。但是有些情况下,那是行不通的。例如,像{Binding Path=DataContext.Foo}这样的绑定。路径可以更复杂,然后单个属性名称。

另外,DataContext可以根据你的位置而改变。默认情况下,DataTemplate中定义的元素不会继承其父数据上下文。所以,如果你有:

<UserControl> 
    <ContextControl Content="Test"> 
     <ContextControl.ContentTemplate> 
      <DataTemplate> 
       <TextBox Text="{Binding Path=Foo, Mode=TwoWay}"/> 
      </DataTemplate> 
     </ContextControl.ContentTemplate> 
    </ContextControl> 
</UserControl> 

然后Foo属性是指该字符串​​不是你的对象。也有在绑定上使用Source,ElementName和RelativeSource属性的情况。

假设您只有一个DataContext并且只使用单个单词路径,那么您可能会找到大多数(如果不是全部)目标。

首先,您需要遍历可视树和逻辑树VisualTreeHelper中的每个元素来遍历可视化树。逻辑树会更有效率。

对于每个元素,您必须遍历定义的每个依赖项属性。为此,你必须使用反射到DependencyProperty类型的公共静态字段。

接下来,对于每个依赖属性,您必须致电GetBindingExpression以获取关联的BindingExpression。然后您可以使用ParentBinding属性获取父级绑定。

然后这是比较路径属性的一个简单问题。

+0

感谢您的回答。我希望Silverlight中的DependencyProperty系统具有一个神奇的功能,可以找到目标的所有依赖关系,但似乎这个问题不会那么简单。 – fsong 2011-06-16 18:29:05

+0

@fsong - 啊,不,它不会:-)从技术上讲,每个绑定可以独立于其他人。 – CodeNaked 2011-06-16 18:38:08

1

是的,而且我知道你需要使用反射,它在性能方面也不是一个好主意。

+0

绑定系统已经有订户列表,因此它可以触发通知。我看不到反射会在图片中出现。 – 2011-06-15 22:58:02

+0

@Joe White:绑定系统对于我所知的所有人来说都是完全内部的,因此需要通过获取所有属性并检查它们是否绑定来解决此问题。如果我错了,请纠正我。 – 2011-06-15 23:09:04