依賴屬性本質上是靜態的,所以如果我創建一個名爲「IsGrayProperty」的bool類型自定義依賴項屬性,並在兩個按鈕上實現它。 然後,如果我在BTN1設置的值,爲什麼它不應該反映在BTN2,爲的DependencyProperty是靜態的,他們是一個.NET包裝財產「IsGray」依賴屬性機制
依賴屬性機制
回答
靜態只讀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; }
當您設置一個TextBlock
的Text
,確實每隔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
的值爲keyValue
。 d1.Add("Foo",32)
不在字符串"Foo"
中存儲整數32
。它存儲在的字典。
每個詞典存儲自己的鍵值。每個DependencyObject
都存儲它自己的屬性值。在內部,它可能將它們存儲在中 a Dictionary
;爲什麼不?如果。NET團隊可以編寫比Dictionary
更高效的存儲鍵/值對的方法,他們會稱之爲Dictionary
。
當您瞭解語言或框架功能的含義時,請始終問自己:「如果我的想法是真實的,該功能是完全無用的還是大量有害的?」如果這個問題的答案是「是」,那麼你猜對功能意味着什麼錯了。這是100%的保證,因爲語言和框架設計師和實施者不會浪費數月的時間來設計完全沒用的功能(classes in Perl 5 come close, though)。
感謝埃德,是的你是對的,但沒有得到如何一個靜態屬性可以有不同的控制值不同,雖然GetValue,Setvalue在結束訪問靜態只讀屬性 – Raj
這完全等同於從字典中檢索項目:'' var foo = new Dictionary
什麼是真正靜態的,是依賴屬性描述:
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
和基礎DependencyObject
的SetValue
。
在內部,DependencyObject
維護一個條目數組(在實例字段中),其中存儲其依賴項屬性的實際值。每個實例都有自己的數組,實際值駐留在其中一個條目中。因此,它永遠不會與其他實例共享。因此,SetValue
改變了當前按鈕實例的狀態,而不是任何靜態狀態。
靜態IsGrayProperty
描述符僅用於確定一個指數到條目數組,執行驗證,等等。這一事實IsGrayProperty
是靜態的,使得它稍微反直觀的考慮,但儘管如此,依賴屬性值是每依賴對象的實例,並且不共享。
感謝Felix,通過使用GetValue和SetValue,我正在訪問已註冊的靜態IsGrayproperty,在這種情況下,靜態屬性將一次只有一個值,因此對於實現的所有控件應該是相同的,發生,我想知道依賴屬性實際上是如何工作的 – Raj
不,不,不。通過使用GetValue和SetValue,您可以訪問包含條目數組的實例字段,每個實例都是私有的。 IsGrayProperty描述符僅用於確定數組中的索引,執行驗證等。由GetValue和SetValue讀取和寫入的實際值位於條目數組中,且每個實例都有其自己的條目數組。 IsGrayProperty是靜態的,這使得它有點反直覺去思考它,但是,依賴屬性值是每個實例的,並且不是共享的。 –
- 1. 依賴屬性更新機制
- 2. 依賴屬性
- 3. 依賴屬性
- 4. WPF:CLR屬性依賴屬性
- 5. 依賴屬性空
- 6. 依賴屬性WPF
- 7. 依賴屬性依賴於另一個
- 8. 不依賴於UserControl的依賴屬性
- 9. 綁定依賴屬性到另一個依賴屬性
- 10. 依賴於其他屬性的依賴屬性
- 11. Maven:通過屬性複製依賴項
- 12. 屬性更改依賴屬性
- 13. 註冊屬性作爲依賴屬性
- 14. 容易依賴項屬性
- 15. 依賴屬性 - 存儲,Grid.Row
- 16. 轉換器依賴屬性
- 17. 使用依賴項屬性
- 18. 鏈接依賴屬性
- 19. 依賴屬性困難
- 20. WPF:依賴屬性和DataContext
- 21. WPF依賴屬性錯誤
- 22. 清除依賴項屬性
- 23. WPF:嵌套依賴屬性
- 24. 依賴屬性does not trigger
- 25. app.xaml.cs中的依賴屬性
- 26. 依賴屬性錯誤
- 27. 簡單的依賴屬性?
- 28. 手稿依賴屬性
- 29. 設置依賴屬性
- 30. 依賴屬性回調
因爲btn2沒有引用btn1的屬性。 – Adam