例如:
<UserControl>
<TextBox Text="{Binding Path=Foo, Mode=TwoWays}"/>
<TextBlock Text="{Binding Path=Foo}"/>
</UserControl>
在代码中,是否可以找到使用Foo属性作为源的依赖项属性列表?
答案 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)
是的,据我所知,你需要使用反射,在性能方面也不是一个好主意。