如何找到绑定到属性的所有目标依赖项属性?

时间:2011-06-14 18:01:18

标签: silverlight data-binding dependency-properties

例如:

<UserControl>
    <TextBox Text="{Binding Path=Foo, Mode=TwoWays}"/>
    <TextBlock Text="{Binding Path=Foo}"/>
</UserControl>

在代码中,是否可以找到使用Foo属性作为源的依赖项属性列表?

2 个答案:

答案 0 :(得分:2)

这实际上取决于H.B.指出,即使在“简单”的情况下它也会非常密集。

在您的示例中,假设您可以获取Bindings,您可以检查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属性引用字符串"Test"而不是您的对象。还有一种情况是在Binding上使用Source,ElementName和RelativeSource属性。

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

首先,您需要迭代视觉和逻辑树VisualTreeHelper中的每个元素来遍历可视树。逻辑树将是tricker。

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

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

然后,比较路径属性很简单。

答案 1 :(得分:1)

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