You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 15:06:18