我对WPF dependencyproperty有疑问。注册dependencyproperty后,它将被注册为public static readonly。
我有点困惑。提前感谢您的帮助。
答案 0 :(得分:2)
DependencyProperty的变量标记为readonly
;在.NET中,这意味着只有变量是只读的。 变量引用的对象的状态仍然可以更改。有关readonly
如何运作的详情,see this MSDN article。
设置DependencyProperty时,它需要两件事:属性的值,要在上设置属性的拥有类型的实例。 DependencyObject / DependencyProperty系统管理哪些实例具有分配给它们的值。
DependencyProperty对类是静态的,因此有一个DependencyProperty实例负责管理所有实例的DP状态。至于为什么这需要大量关于DependencyObjects的解释。
答案 1 :(得分:1)
当您更改DependencyProperty
的值时,您就是这样做:更改它的值。您不更改对DependencyProperty
实例的引用。因此,将其标记为readonly
是有效的。它类似于拥有某个类的实例。您可以在仍然能够修改类的内部值的同时标记该实例readonly
。即:
private readonly List<string> mSomeCollection = new List<string>();
// Modifying the collection is allowed
mSomeCollection.Add(...);
mSomeCollection.Remove(...);
// Re-assigning the mSomeCollection variable is disallowed with readonly specified
mSomeCollection = new List<string>();
至于静态实例问题,我认为它与DependencyProperty
值的设置方式有关 - 它们是根据属性的目标设置的,而不是属性本身(我认为) 。我不完全确定这部分是如何工作的(我需要阅读它),但请查看MSDN以获取有关依赖属性的概述,这可能会对此有所了解。
答案 2 :(得分:0)
您从Register(...)
收到的对象是DependencyProperty
的描述符。那个是只读的;如果您愿意,您无法修改属性的属性 - 属性的元数据。 (例如,您无法修改继承行为。)
但是,您可以使用SetValue(...)
方法修改属性的值。为了使用XAML中的属性,您应该为DependencyProperty
声明一个包装器CLR属性,如链接文章中的示例所示。
答案 3 :(得分:0)
DependencyProperties的工作方式类似于Dictionary<object,object>
。您始终设置对象的值,而不是DependencyProperty本身的值。这就是为什么它可以是静态的。它也是静态的,因为这种方式更快。