2016-07-12 75 views
-2

依赖属性本质上是静态的,所以如果我创建一个名为“IsGrayProperty”的bool类型自定义依赖项属性,并在两个按钮上实现它。 然后,如果我在BTN1设置的值,为什么它不应该反映在BTN2,为的DependencyProperty是静态的,他们是一个.NET包装财产“IsGray”依赖属性机制

+0

因为btn2没有引用btn1的属性。 – Adam

回答

0

静态只读DependencyProperty名为IsGrayProperty是一个标识符 - 可以这么说,一个关键的价值。它还包含有关该属性的元数据。这不是实际的财产本身。每个DependencyObject实例在内部都存储自己的DependencyProperty值。

依赖属性是语义非常像普通的实例属性,但它们有附加功能这让他们做的事情,普通实例属性不能(例如,你可以在运行时经常改变自己的元数据,不像Attributes属性,并且您可以创建附加属性)。这就是他们存在的原因。

例如,TextBlock.Text是依赖项属性。

// 
// Summary: 
//  Identifies the System.Windows.Controls.TextBlock.Text dependency property. 
// 
// Returns: 
//  The identifier of the System.Windows.Controls.TextBlock.Text dependency property. 
[CommonDependencyProperty] 
public static readonly DependencyProperty TextProperty; 

而且它有一个“常规属性”包装,也:

// 
// Summary: 
//  Gets or sets the text contents of a System.Windows.Controls.TextBlock. 
// 
// Returns: 
//  The text contents of this System.Windows.Controls.TextBlock. Note that all 
//  non-text content is stripped out, resulting in a plain text representation 
//  of the System.Windows.Controls.TextBlock contents. The default is System.String.Empty. 
[Localizability(LocalizationCategory.Text)] 
public string Text { get; set; } 

当您设置一个TextBlockText,确实每隔TextBlock共享相同的文字?不,当然不。如果他们这样做,依赖属性将是完全无用的。

DependencyProperty参数为GetValue告诉DependencyObject哪个值从依赖项对象自己的内部属性值存储中检索;如果值存储在DependencyProperty本身中,则您将查询DependencyProperty,而不是DependencyObject

public void ForExample(TextBlock tb) 
{ 
    var oldtext = tb.GetValue(TextBlock.TextProperty) as String; 

    tb.SetValue(TextBlock.TextProperty, "Test value"); 
} 

如果只有一个TextBlock.TextProperty全球价值,它的存储TextBlock.TextProperty,究竟为什么我们呼吁的TextBlock一些随机的情况下GetValue()SetValue()?为什么要让某个特定的TextBlock实例进入该行为?

相反,我们会打电话给TextBlock.TextProperty.SetValue()

这就像一个解释:

var d1 = new Dictionary<String, Object>(); 
var d2 = new Dictionary<String, Object>(); 
var keyValue = "Foo"; 

d1.Add(keyValue, 32); 

Console.WriteLine(d2[keyValue]); 

你会从d2[keyValue]有什么期望?你会期望没有什么,因为你从未给d2的值为keyValued1.Add("Foo",32)不在字符串"Foo"中存储整数32。它存储在的字典

每个词典存储自己的键值。每个DependencyObject都存储它自己的属性值。在内部,它可能将它们存储在 a Dictionary;为什么不?如果。NET团队可以编写比Dictionary更高效的存储键/值对的方法,他们会称之为Dictionary

当您了解语言或框架功能的含义时,请始终问自己:“如果我的想法是真实的,该功能是完全无用的还是大量有害的?”如果这个问题的答案是“是”,那么你猜对功能意味着什么错了。这是100%的保证,因为语言和框架设计师和实施者不会浪费数月的时间来设计完全没用的功能(classes in Perl 5 come close, though)。

+0

感谢埃德,是的你是对的,但没有得到如何一个静态属性可以有不同的控制值不同,虽然GetValue,Setvalue在结束访问静态只读属性 – Raj

+0

这完全等同于从字典中检索项目:'' var foo = new Dictionary ();/*添加东西*/var x = foo [“Bar”];'。如果您有六种不同的字典,则每个字典都会存储自己的“酒吧”个人价值。 'GetValue'的'DependencyProperty'参数告诉'DependencyObject'从自己的内部存储中检索哪个值;如果该值存储在'DependencyProperty'本身中,则将查询'DependencyProperty',*而不是* DependencyObject'。 –

0

什么是真正静态的,是依赖属性描述:

public static readonly DependencyProperty IsGrayProperty =  
    DependencyProperty.Register(
     "IsGray", 
     typeof(bool), 
     typeof(MyButton)); 

描述符仅包含有关财产的元数据,并且它不包含它的价值。

进行使用的数据绑定和代码访问的实际属性,是实例之一:

public bool IsGray 
{ 
    get 
    { 
     return (bool)GetValue(IsGrayProperty); 
    } 
    set 
    { 
     SetValue(IsGrayProperty, value); 
    } 
} 

,你可以看到,它代表获取和设置实例方法GetValue和基础DependencyObjectSetValue

在内部,DependencyObject维护一个条目数组(在实例字段中),其中存储其依赖项属性的实际值。每个实例都有自己的数组,实际值驻留在其中一个条目中。因此,它永远不会与其他实例共享。因此,SetValue改变了当前按钮实例的状态,而不是任何静态状态。

静态IsGrayProperty描述符仅用于确定一个指数到条目数组,执行验证,等等。这一事实IsGrayProperty是静态的,使得它稍微反直观的考虑,但尽管如此,依赖属性值是每依赖对象的实例,并且不共享。

+0

感谢Felix,通过使用GetValue和SetValue,我正在访问已注册的静态IsGrayproperty,在这种情况下,静态属性将一次只有一个值,因此对于实现的所有控件应该是相同的,发生,我想知道依赖属性实际上是如何工作的 – Raj

+0

不,不,不。通过使用GetValue和SetValue,您可以访问包含条目数组的实例字段,每个实例都是私有的。 IsGrayProperty描述符仅用于确定数组中的索引,执行验证等。由GetValue和SetValue读取和写入的实际值位于条目数组中,且每个实例都有其自己的条目数组。 IsGrayProperty是静态的,这使得它有点反直觉去思考它,但是,依赖属性值是每个实例的,并且不是共享的。 –