2013-10-18 50 views
14

爲什麼一個依賴屬性必須是靜態的?爲什麼依賴屬性必須是靜態

我已經看到它已經在這裏發佈了一些帖子,但我無法正確理解它。

如果有人能夠幫助我理解一個小片段,那將會很棒。

+0

[非靜態依賴屬性]的可能的重複(http://stackoverflow.com/questions/3660696/non-static-dependency-properties) –

+0

在上述問題的答案的解釋是相當基本的,請閱讀基礎知識後,我們可以辯論約束條件是否有效。 –

+0

@ M.Babcock:這就是我在描述中所說的,我已經看到了幾個解釋但並不全面。我已經看到你在這裏寫我的問題之前給的鏈接,並且,還有我也看到了這一點http://stackoverflow.com/questions/2989431/why-are-dependency-properties-static – Learner

回答

25

這裏的奇妙之處在於,DependencyProperty的聲明是static而不是它的value(即存儲器存儲)。您使用static關鍵字添加的聲明僅僅是DependencyObjectDependencyProperty的標識符,因爲相同的標識符將由該DependencyObject的所有實例共享以標識該屬性,因此將其設置爲static是有意義的。

在另一方面,當你調用SetValueDependancyObject實例上設置的DependancyProperty的值,然後在其上調用setValue的DependancyObject每個實例都將存儲屬性的本地值。這是由DependancyObject類保持排序的Dictionary其具有DependancyProperty標識符和局部值之間的映射內部處理。

+0

非常感謝你Nit,這對我有很大的幫助。我也在尋找一些可以更好地理解它的好的片段。 – Learner

+0

我不明白這一行 - 「相同的標識符將被該依賴對象的所有實例共享」如果你可以請解釋我,這將是非常好的,我是編程新手:( – Learner

+1

,你可以把它作爲關鍵的keyvaluepair字典的那個DependancyObject具有存儲依賴屬性的值。由於每個實例可以擁有的屬性不同的值,而是確定我們不需要不同的密鑰該值,因爲每個實例的值將對應於相同的密鑰。 。因此,它是靜態的 – Nitin

5

的DependencyProperty必須是靜態(類級別),因爲當我們創建具有該屬性的類的多個對象,並想引用該屬性的值必須來自的DependencyProperty的靜態實例的默認值。因此,我們類的所有實例的默認值都是相同的,系統不會爲該類的每個實例的DependencyProperty保留內存。 這樣可以減少內存佔用。

現在,下一個問題出現,如果我們明確地設置的DependencyProperty的值類的對象。(代碼或動畫或樣式)

在這種情況下的DependencyObject進入圖片。任何具有DependencyProperty的類都必須從DependencyObject類(WPF特定類派生,該類維護名爲EffectiveValues的集合)。當用戶在類的對象上(通過代碼或動畫或樣式)將DependencyProperty的值明確設置爲該值時,該值將存儲在駐留在DependencyObject類內的那個EffectiveValues集合中,並在那裏保留內存。

+0

很好的回答;然而,DependencyObject不是WPF特定的類 - 它也可以在Silverlight和WinRT中使用。 –

相關問題