寫在之前:
依賴屬性算是wpf醉醉基礎的乙個組成了。平時寫**的時候,簡單的繫結很輕鬆,但是遇到複雜的層次比較多的繫結,真的是要命。所以,我覺得深刻認識依賴屬性是很有必要的。本篇只是個人學習的記錄,學習的部落格是周永恆先生的《一站式wpf--依賴屬性(dependencyproperty)》,
這算是乙個系列了,說的很詳細。如果需要更好的學習,建議移步上述原文
,受益匪淺。
什麼是依賴屬性?
windows presentation foundation (wpf) 提供了一組服務,這些服務可用於擴充套件公共語言執行時 (clr) 屬性的功能,這些服務通常統稱為 wpf 屬性系統。由 wpf 屬性系統支援的屬性稱為依賴項屬性。----msdn也就是說,wpf提供一組叫做『wpf屬性系統』的服務,而依賴屬性就是被這個服務所支援的屬性。我只能說,每個字都認識,但是放在一起認識的就不那麼清晰了……
首先,想要了解它,必須知道它是為了什麼而來。
雖然不清楚依賴屬性,但是屬性我們是很清楚的,封裝類的字段,表示類的狀態,編譯後被轉化為get_,set_方法,可以被類或結構等使用,常見的乙個屬性如下:
public既然已經有了屬性,為什麼還要有依賴屬性呢?必然是屬性有一些缺點了,而依賴屬性恰好能夠解決這個問題。以button為例:class
classobject
set }}
每次繼承,父類的私有欄位都被繼承下來。對button來說,大多數屬性並沒有被修改,仍然保持父類定義時的預設值。通常情況下,在整個button的物件生命週期中,也只有少部分屬性被修改。也已看得出來:
每次繼承,子類物件都會獲得更多的屬性,這樣,繼承樹的低端物件不可避免的膨脹;
既然大多數屬性沒有被修改,那麼就可以把這些屬性從物件中剝離,減少物件的體積;
可以知道,依賴屬性就是為了解決這個問題誕生了。首先定義依賴屬性,它裡面儲存之前2中希望剝離的屬性:
public然後定義dependencyobject來使用dp:class
dependencyproperty
//對外暴露乙個register方法用來註冊新的dp
public
static dependencyproperty register(string name, type propertyname, type ownertype, object
defaultvalue)
}
publicdependencyobject和文章開篇的classobject中的name有什麼不同呢?class
dependencyobject
public
void setvalue(dependencyproperty dp, object
value)
public
string
name
set }
}
>>dependencyobject.name的實際值不是用字段儲存在dependencyobject中,而是儲存在nameproperty中,通過setvalue和getvalue來金星賦值取值操作。
在上述例子中,所有dependncuobject的物件將共用乙個nameproperty,這在現實中是不實際的:只要修改乙個物件的屬性,相當於所有物件的屬性值都被修改了。所以,修改的屬性,還是要維護在相應的物件中的:(修改部分用☆表示)
public所有修改過的dp都儲存在effectivevalueentry裡,這樣,就可以只儲存修改的屬性,未修改過的屬性仍然讀取dp的預設值,優化了屬性的儲存。class
dependencyproperty
//對外暴露乙個register方法用來註冊新的dp
public
static dependencyproperty register(string name, type propertyname, type ownertype, object
defaultvalue)
}
public classdependencyobjectelse
}public void setvalue(dependencyproperty dp, objectvalue)
else;
} = value;
} public stringname
set}
}
internal structeffectivevalueentryinternal object value
}
WPF 依賴屬性
原文 wpf 依賴屬性 屬性和事件是.net抽象模型的核心部分,wpf在這之上增加了dependency property 依賴屬性 依賴屬性使用更高效的儲存機制,並且支援附加的功能,更改通知 屬性值繼承 在元素樹中向下傳播預設屬性值 以及減少屬性儲存空間。依賴屬性是wpf動畫 資料繫結和樣式的基礎...
WPF依賴屬性
依賴屬性是一種可以自己沒有值,並能通過使用binding從資料來源獲取值 依賴在別人身上 的屬性。優點 wpf的所有控制項都是依賴屬性。依賴物件被dependencyobject類實現,依賴屬性由dependencyproperty類實現。dependencyobject有getvalue setv...
WPF 依賴屬性
屬性是我們再熟悉不過的了,那麼究竟依賴屬性怎麼寫呢?依賴屬性和屬性到底有什麼區別和聯絡呢?其實依賴屬性的實現很簡單,只要做以下步驟就可以實現 第一步 讓所在型別繼承自 dependencyobject基類,在wpf中,我們仔細觀察框架的類圖結構,你會發現幾乎所有的 wpf 控制項都間接繼承自depe...