2010-03-24 51 views

回答

16

DependencyProperty是一個屬性,其值取決於(或可能取決於)其他源(如動畫,數據綁定,樣式或可視化樹繼承)。常規屬性的值存儲在它所屬的對象中,而您可以將依賴項屬性視爲存儲在某個數據庫中。這個數據庫本質上是由一個字典組成,它將(對象,屬性)對映射到它們的值,以及哪些屬性依賴於其他屬性的映射(例如,當您更改Panel的DataContext時,它可以通知所有小組內的兒童)。

那麼爲什麼他們將屬性值存儲在某個神奇的數據庫中?有幾個原因:

  • 它減少了存儲空間。將一個屬性(即使其值爲空)添加到類中,會爲該類的每個實例添加4個字節(對於64位進程爲8)。當實例具有值時,DependencyProperty只佔用空間。例如,一個FrameworkElement有幾十個依賴屬性,其中大多數從來沒有賦值。如果所有這些屬性都存儲在類中,則每個實例都會有數百個字節。相反,每個實例只有大約40個字節。

  • 它啓用附加屬性。諸如Canvas.LeftGrid.Row之類的屬性必須存儲在從未聽說過CanvasGrid的對象上,因此您將它們放在哪裏?你把它們放在一個數據庫的某個地方。

  • 它啓用自動屬性更改。想象一下,你將如何實現類似於樣式或屬性繼承的東西(能夠在父元素上設置字體或數據上下文的功能,並將其值傳播到所有子元素)。將所有這些存儲在數據庫中使得代碼全部集中在一個地方,而不是針對每個需要它的對象和屬性單獨實現。

+0

參考第一點,字節空間問題在控件中有多個屬性的winforms中從未出現過。 – thewpfguy 2010-07-31 06:56:55

+0

thewpfguy:Winforms控件由hWnds支持,它有很多開銷,以致雜項事件和屬性佔用的字節數是不相關的。 – Gabe 2010-07-31 13:09:24

+0

這就是要點。在Winforms中,即使有很多開銷 - hwnd,event,properties(有些從未分配過) - 內存使用率從來都不是問題。如果確實是一個問題,那麼這個設計支持dep。支柱。也可以在那裏實施。我發現在許多書籍和文章中引用了這種高效的內存空間優勢,但它正在解決一個並不存在或無關緊要的問題。我相信即使這是dep的好處之一。財產應該是最不重要的一個。 – thewpfguy 2010-08-01 05:01:36

0

MSDN提供了很好的定義,描述和例子

有關的DependencyProperty的更深刻的理解檢查here

2

「給你一堆的基礎設施做一切你經常要與正常做的事情財產 - 驗證它,強制它進入適當的範圍,發佈變更通知,以及其他一些方面。「

WPF Tutorial - Introduction To Dependency Properties

+0

驗證,強制和更改通知都可能與常規的CLR屬性以及 – gn22 2010-03-24 16:38:19

+0

感謝您分享鏈接,我個人發現它非常有幫助。 – 2010-11-14 13:18:49

1

一個依賴屬性是受WPF屬性系統,而不是通過在聲明類的字段支持的屬性。

這意味着,因爲WPF擁有該屬性,所以在計算屬性值時,WPF可以考慮各種考慮因素 - 例如動畫,樣式和數據綁定。另一個結果是,因爲屬性是由WPF管理的,所以它們不必在概念上具有狀態的類上聲明:因此,附加屬性允許例如將網格特定狀態與非網格對象相關聯的網格。 (順便說一下,我之前提到過WPF,因爲這是使用DP的主要框架,但Windows Workflow Foundation也具有依賴屬性的概念。因此,要嚴格正確,DP是一個有支持的屬性通過外部財產製,特別是允許「最後設定值」以外的因素在獲得財產價值時起作用的系統)。

+0

這裏的最佳補充信息是接受答案。 – KMC 2016-08-31 05:51:07

1

依賴關係屬性是基於其他方面,如缺省值,驗證,脅迫,值繼承或動畫,其中電流值取決於一個屬性(因此而得名)。

此外,依賴屬性還內置了對變更通知,數據綁定和樣式的支持。

它們是什麼?

一堆類和使用它們的已定義方式,它們提供上述功能以用於從DependencyObject繼承的類。

它們不是語言功能。它們是.NET Framework的一個功能。

+0

謝謝。好一個。 – Freelancer 2013-06-05 12:12:52

0

依賴項屬性取決於多個提供程序在任何時間點確定其值。這些提供者可以是一個不斷改變它的值的動畫,一個其屬性值傳播給它的子元素的父元素,等等。

可以說,依賴屬性的最大特點是其內置的提供更改通知的功能。

只要依賴項屬性的值發生更改,WPF就會根據屬性的元數據自動觸發多個操作。這些操作可以重新渲染適當的元素,更新當前佈局,刷新數據綁定,以及更多其他功能。通過此內置更改啓用的最有趣的功能之一是屬性觸發器,它允許您在屬性值更改時執行您自己的自定義操作,而無需編寫任何程序代碼。