WPF依賴屬性DependencyProperty

2022-03-14 12:22:31 字數 2425 閱讀 8408

寫在之前:

依賴屬性算是wpf醉醉基礎的乙個組成了。平時寫**的時候,簡單的繫結很輕鬆,但是遇到複雜的層次比較多的繫結,真的是要命。所以,我覺得深刻認識依賴屬性是很有必要的。本篇只是個人學習的記錄,學習的部落格是周永恆先生的《一站式wpf--依賴屬性(dependencyproperty)》,

這算是乙個系列了,說的很詳細。如果需要更好的學習,建議移步上述原文

,受益匪淺。

什麼是依賴屬性?

windows presentation foundation (wpf) 提供了一組服務,這些服務可用於擴充套件公共語言執行時 (clr) 屬性的功能,這些服務通常統稱為 wpf 屬性系統。由 wpf 屬性系統支援的屬性稱為依賴項屬性。----msdn

也就是說,wpf提供一組叫做『wpf屬性系統』的服務,而依賴屬性就是被這個服務所支援的屬性。我只能說,每個字都認識,但是放在一起認識的就不那麼清晰了……

首先,想要了解它,必須知道它是為了什麼而來。

雖然不清楚依賴屬性,但是屬性我們是很清楚的,封裝類的字段,表示類的狀態,編譯後被轉化為get_,set_方法,可以被類或結構等使用,常見的乙個屬性如下:

public

class

classobject

set }}

既然已經有了屬性,為什麼還要有依賴屬性呢?必然是屬性有一些缺點了,而依賴屬性恰好能夠解決這個問題。以button為例:

每次繼承,父類的私有欄位都被繼承下來。對button來說,大多數屬性並沒有被修改,仍然保持父類定義時的預設值。通常情況下,在整個button的物件生命週期中,也只有少部分屬性被修改。也已看得出來:

每次繼承,子類物件都會獲得更多的屬性,這樣,繼承樹的低端物件不可避免的膨脹;

既然大多數屬性沒有被修改,那麼就可以把這些屬性從物件中剝離,減少物件的體積;

可以知道,依賴屬性就是為了解決這個問題誕生了。首先定義依賴屬性,它裡面儲存之前2中希望剝離的屬性:

public

class

dependencyproperty

//對外暴露乙個register方法用來註冊新的dp

public

static dependencyproperty register(string name, type propertyname, type ownertype, object

defaultvalue)

}

然後定義dependencyobject來使用dp:

public

class

dependencyobject

public

void setvalue(dependencyproperty dp, object

value)

public

string

name

set }

}

dependencyobject和文章開篇的classobject中的name有什麼不同呢?

>>dependencyobject.name的實際值不是用字段儲存在dependencyobject中,而是儲存在nameproperty中,通過setvalue和getvalue來金星賦值取值操作。

在上述例子中,所有dependncuobject的物件將共用乙個nameproperty,這在現實中是不實際的:只要修改乙個物件的屬性,相當於所有物件的屬性值都被修改了。所以,修改的屬性,還是要維護在相應的物件中的:(修改部分用☆表示)

public

class

dependencyproperty

//對外暴露乙個register方法用來註冊新的dp

public

static dependencyproperty register(string name, type propertyname, type ownertype, object

defaultvalue)

}  

所有修改過的dp都儲存在effectivevalueentry裡,這樣,就可以只儲存修改的屬性,未修改過的屬性仍然讀取dp的預設值,優化了屬性的儲存。

public classdependencyobject

else

}public void setvalue(dependencyproperty dp, objectvalue)

else;

} = value;

} public stringname

set}

}

internal structeffectivevalueentry

internal object value

}

WPF 依賴屬性

原文 wpf 依賴屬性 屬性和事件是.net抽象模型的核心部分,wpf在這之上增加了dependency property 依賴屬性 依賴屬性使用更高效的儲存機制,並且支援附加的功能,更改通知 屬性值繼承 在元素樹中向下傳播預設屬性值 以及減少屬性儲存空間。依賴屬性是wpf動畫 資料繫結和樣式的基礎...

WPF依賴屬性

依賴屬性是一種可以自己沒有值,並能通過使用binding從資料來源獲取值 依賴在別人身上 的屬性。優點 wpf的所有控制項都是依賴屬性。依賴物件被dependencyobject類實現,依賴屬性由dependencyproperty類實現。dependencyobject有getvalue setv...

WPF 依賴屬性

屬性是我們再熟悉不過的了,那麼究竟依賴屬性怎麼寫呢?依賴屬性和屬性到底有什麼區別和聯絡呢?其實依賴屬性的實現很簡單,只要做以下步驟就可以實現 第一步 讓所在型別繼承自 dependencyobject基類,在wpf中,我們仔細觀察框架的類圖結構,你會發現幾乎所有的 wpf 控制項都間接繼承自depe...