如何解决如何找到绑定到属性的所有目标依赖项属性?
| 例如:<UserControl>
<TextBox Text=\"{Binding Path=Foo,Mode=TwoWays}\"/>
<TextBlock Text=\"{Binding Path=Foo}\"/>
</UserControl>
在代码中,是否可以找到将Foo属性用作源的依赖项属性列表?
解决方法
确实取决于H.B.指出,但是即使在“简单”的情况下,它也将是非常密集的。
在您的示例中,假设您可以使用Bindings,则可以检查Path属性,看看它是否引用了您的\“ Foo \”属性。但是在某些情况下,那是行不通的。例如,诸如“ 1”的绑定。路径可能比单个属性名称复杂得多。
此外,DataContext可以根据您所在的位置而变化。默认情况下,在DataTemplate中定义的元素不会继承其父级数据上下文。因此,如果您有:
<UserControl>
<ContextControl Content=\"Test\">
<ContextControl.ContentTemplate>
<DataTemplate>
<TextBox Text=\"{Binding Path=Foo,Mode=TwoWay}\"/>
</DataTemplate>
</ContextControl.ContentTemplate>
</ContextControl>
</UserControl>
然后,“ 3”属性将引用字符串“ 4”,而不是您的对象。在绑定中还使用Source,ElementName和RelativeSource属性的情况。
假设您只有一个DataContext并且仅使用单个单词路径,那么您可能会找到大多数(如果不是全部)目标。
首先,您需要遍历视觉树和逻辑树VisualTreeHelper中的每个元素以遍历视觉树。逻辑树会更复杂。
对于每个元素,您都必须遍历定义的每个依赖项属性。为此,您必须对类型为DependencyProperty的公共静态字段使用反射。
接下来,对于每个依赖项属性,您必须调用GetBindingExpression以获取关联的BindingExpression。然后,您可以使用ParentBinding属性获取父绑定。
然后,只需比较路径属性即可。
, 是的,就我所知,您需要使用反射,就性能而言也不是一个好主意。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。