例如:
<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属性获取父绑定。
然后就是比较路径属性的简单问题。
是的,据我所知,您需要使用反射,就性能而言,这也不是一个好主意。