2016-07-12 72 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是靜態的,這使得它有點反直覺去思考它,但是,依賴屬性值是每個實例的,並且不是共享的。 –