DependencyProperties如何工作?

时间:2012-01-17 14:13:52

标签: wpf dependency-properties

我对WPF dependencyproperty有疑问。注册dependencyproperty后,它将被注册为public static readonly。

  1. 如果是只读,那么如何改变价值呢?
  2. 如果它是静态的,那么只有一个实例。假设我有一个依赖属性,有些属性可用于类按钮。如果我有两个按钮具有不同的someproperty值。 WPF如何处理它?<​​/ li>

    我有点困惑。提前感谢您的帮助。

4 个答案:

答案 0 :(得分:2)

  1. DependencyProperty的变量标记为readonly;在.NET中,这意味着只有变量是只读的变量引用的对象的状态仍然可以更改。有关readonly如何运作的详情,see this MSDN article

  2. 设置DependencyProperty时,它需要两件事:属性的值,要在上设置属性的拥有类型的实例。 DependencyObject / DependencyProperty系统管理哪些实例具有分配给它们的值。

  3. 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本身的值。这就是为什么它可以是静态的。它也是静态的,因为这种方式更快。