前言
我们在 WPF 中使用绑定时可以使用 ElementName=Foo 这样的写法,并且还能够真的在运行时找到这个名称对应的对象,是因为 WPF 中提供了名称范围概念。
实现 INameScope 接口可以定义一个名称范围。无论你使用 Name 属性还是使用 x:Name 特性都可以在一个名称范围内指定某个元素的名称。绑定时就在此名称范围内查找,于是可以找到你需要的对象。
XAML中的NameScope
首先来讲讲WPF的名称管理机制NameScope,也即是名称范围。名称范围主要提供了两种功能:记录XAML名称与界面元素实例之间的关联关系;防止名称冲突。可以说,第二种功能是第一种功能实现时所产生的副作用。而在XAML中引用某个名称时,WPF会自动使用相应的NameScope执行对名称的查找。
那么,WPF的名称范围是如何在XAML等程序组成中起作用的呢?如果一个元素在XAML中使用x:Name或Name属性设置了名称,那么WPF会为该属性设置执行一些额外的执行逻辑,如在对应的cs文件中自动生成具有相同名称的成员,并将它们注册到相应的名称范围中。如果在该范围中多次使用了相同的名称,那么WPF会抛出一个异常。在XAML中对某个元素进行引用的时候,WPF会从该NameScope中寻找该名称所对应的界面元素以进行操作。
当然,用户并不需要显式地对名称范围进行处理。默认情况下,WPF会使用一定的机制保证该文件中的各个界面元素可以拥有合适的名称范围。在XAML中常常作为根元素的Page类及Window类都提供了对名称范围的支持。如果XAML中的根元素并不是这两个类型,那么XAML处理器会在处理过程中为该文件隐式地添加一个Page元素作为新的根元素。通过这种方法,WPF可以保证XAML文件中对x:Name以及Name的使用可以将名称正确地注册进相应的名称范围中。










