WPF中自定义类的静态DependencyProperty为何能为不同对象设不同值?
WPF DependencyProperty静态字段为何能为不同实例存储不同值?
问题场景
我正在学习WPF,对DependencyProperty存在理解困惑。DependencyProperty对象始终被声明为public static readonly,示例C#代码如下:
public class Phone : DependencyObject { public static readonly DependencyProperty TitleProperty; public static readonly DependencyProperty PriceProperty; static Phone() { TitleProperty = DependencyProperty.Register("Title", typeof(string), typeof(Phone)); PriceProperty = DependencyProperty.Register("Price", typeof(int), typeof(Phone)); } public string Title { get { return (string)GetValue(TitleProperty); } set { SetValue(TitleProperty, value); } } public int Price { get { return (int)GetValue(PriceProperty); } set { SetValue(PriceProperty, value); } } }
但在XAML中创建该类的不同Phone对象时,却能为这些属性赋予不同值,示例XAML代码如下:
<Window.Resources> <local:Phone Price="600" Title="iPhone 6S" x:Key="iPhone6s" /> <local:Phone Price="601" Title="iPhone 7S" x:Key="iPhone7s" /> </Window.Resources>
将这些对象信息展示在Grid上时,会发现它们的Title和Price值各不相同。我知道普通静态字段的所有类对象值一致,但此处并非如此,请问原因是什么?
核心原因
- 静态DependencyProperty字段是属性的"标识符"而非存储容器:这个静态字段本质是WPF属性系统用来识别某个依赖属性的唯一标记,它本身并不存储任何实例的属性值,所有Phone实例共享这个标记,但不会共享值。
- 实例值存储在DependencyObject的内部结构中:每个继承自
DependencyObject的实例(比如上述的iPhone6s、iPhone7s)都有自己独立的内部存储(类似哈希表结构)。当调用GetValue(TitleProperty)或SetValue(TitleProperty, value)时,是用静态的TitleProperty作为键,去当前实例的内部存储中读取或写入对应的值。 - Register方法的作用:
DependencyProperty.Register方法是把该属性的元数据(属性名称、数据类型、所属类等)注册到WPF的全局属性系统中,返回的静态字段就是后续访问该属性的"钥匙",所有实例用同一把钥匙,但各自打开自己的"存储抽屉"操作数据。
简单来说,你看到的"不同实例有不同值",不是静态字段的值变了,而是每个实例用同一个静态字段作为索引,去自己的专属存储里取到了不同的数据。
内容的提问来源于stack exchange,提问作者Alex Rage
相关产品推荐
相关产品推荐

