如何查找绑定到某个属性的所有目标依赖属性



例如:

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

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

正如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",而不是您的对象。还有一种情况是在绑定上使用Source、ElementName和RelativeSource属性。

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

首先,您需要遍历可视化树和逻辑树VisualTreeHelper中的每个元素来遍历可视化树。逻辑树是个骗子。

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

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

然后就是比较路径属性的简单问题。

是的,据我所知,您需要使用反射,就性能而言,这也不是一个好主意。

最新更新