{Binding ElementName=foo}
,它会查找视觉树还是逻辑树?关于 WPF 中的逻辑树和视觉树,请参考此博客文章:Of logical and visual trees in WPF | Data See, Data Do。当使用 {Binding ElementName=Foo} 时,它会查找名称范围,而这与可继承属性一样,需要向上遍历祖先节点来查找逻辑树。
另外,在 Silverlight 中可以通过附加行为使用 ElementName 和 RelativeSource 绑定,以便在视觉树中查找其他元素进行绑定,具体请参阅此博客文章:ElementName binding in Silverlight via Attached Behaviours。
编辑后:
根据 MSDN 文章 FrameworkElement Class,看起来逻辑树用于通过
ElementName
进行绑定。 FrameworkElement 扩展了 UIElement 并添加了对数据绑定和动态资源引用的支持,但是在存储为 Expression 的成员值(支持数据绑定和动态资源的编程结构)的解析能力由 FrameworkElement 实现。ElementName
指向x:Name
,因此必须以某种方式找到该名称。这里涉及到一个NameScope概念。
对于大多数场景,应调用FrameworkElement和FrameworkContentElement公开的FindName方法来按名称搜索元素,而应使用FrameworkElement和FrameworkContentElement公开的Name属性作为标记属性设置初始名称。在FrameworkElement和FrameworkContentElement上公开的RegisterName方法是必要的,以在特定命名范围内建立名称(没有可以直接完成此操作的NameScope成员;您必须首先设置当前名称范围才能使用RegisterName)。
另一方面,Visual类既没有FindName
方法,也没有实现INameScope。