在.net中,我們可以屬性來獲取或設定欄位的值,不需要在編寫額外的get和set方法,但這有乙個前提,那就是需要在物件中擁有乙個字段,才能在此字段的基礎上獲取或設定欄位的值,比如:
// 字段
private int _age = 23;
// 屬性
public int age
set
}
但在wpf中,微軟引入了一種依賴屬性的方法來獲取或者設定控制項的值,之所以叫做依賴,是因為這個值能夠從其他資料來源中獲取值(依賴在別人身上)而在控制項物件上不儲存這個值,所以依賴屬效能有效地較少記憶體開銷。
依賴屬性先簡單說到這裡,有時我們往往只是記住了結論而忽略了推導過程,下面的我對推到過程的一些思考:
**如果讓我們自己來實現依賴屬性,我們該怎麼實現呢? **
首先能確定的是,我們不能定義控制項擁有的所有字段,如果定義了,那麼控制項物件被建立時,所有欄位都會被初始化,都會有乙個初始值,記憶體就會被浪費,這樣不行,所以我就想到了用字典dictionary
的方式來儲存需要的值。用int
來儲存乙個索引值,保證控制項中的每個屬性索引值都不一樣;用object
來儲存屬性的值。
由於每種控制項都需要此字典來儲存值,所以控制項要有乙個基類,這裡我取名mydependencyobject
,它的結構大致應該是這樣:
/// /// 依賴物件
///
public class mydependencyobject
public void setvalue(int index, object value)
}
然後我們應該確定的是,控制項的每個屬性都應該有個索引值啊,這樣才能在_keyvalue
字典中找到對應的值。然後又想到這個索引值應該是和物件無關的,是和類相關的,所以應該是一種靜態的方式來得到這個索引值,所以實現的方式大概是這樣:
/// /// 依賴物件
///
public class mydependencyobject
public void setvalue(int index, object value)
// 某種演算法根據屬性名獲取乙個索引值
protected static int getindex(string propertyname)
}/// /// 按鈕控制項
///
public class mybutton : mydependencyobject
set}
}
在基類mydependencyobject
中定義乙個靜態方法getindex
,子類根據屬性的名字來獲取唯一的索引,然後在根據索引值來獲取和設定值。
雖然上面的方式已經可以達到節省記憶體的目的,但是對於屬性更多的控制,比如屬性的預設值、值變化**、是否是唯讀的等等這些都達不到要求,所以屬性應該被定義成更複雜的型別以完成更多的功能,而不是是用乙個int
的索引就完成了,所以我把這個更複雜的型別定義為mydependencyproperty
,它的結構如下:
/// /// 依賴屬性
///
public class mydependencyproperty
/// /// 建構函式
///
public mydependencyproperty(string propertyname, type owntype, mypropertymetadata data)
/// ///屬性名
///
public string name
/// /// 擁有者型別
///
public type owntype
/// /// 屬性資料
///
public mypropertymetadata defaultmetadata
/// /// 使用某種演算法按照屬性名獲取乙個索引值
///
///
///
///
private static int getindex(string propertyname, type owntype)
}/// /// 屬性資料
///
public class mypropertymetadata
/// /// 預設值
///
public object defaultvalue
// 其他的值 ...
}
mydependencyproperty
中包含了靜態字段dictionary_indexproperty
,它儲存了索引-依賴屬性的集合,整個應用程式只包含乙個集合。通過靜態方法getindex(string propertyname, type owntype)
計算索引值,計算索引值需要屬性名和擁有者型別,這樣可以計算出唯一的索引。
像下面這樣使用上面的依賴屬性:
/// /// 依賴物件
///
public class mydependencyobject
else
}public void setvalue(mydependencyproperty dp, object value)
}/// /// 按鈕控制項
///
public class mybutton : mydependencyobject
set}
}
WPF 依賴屬性
原文 wpf 依賴屬性 屬性和事件是.net抽象模型的核心部分,wpf在這之上增加了dependency property 依賴屬性 依賴屬性使用更高效的儲存機制,並且支援附加的功能,更改通知 屬性值繼承 在元素樹中向下傳播預設屬性值 以及減少屬性儲存空間。依賴屬性是wpf動畫 資料繫結和樣式的基礎...
WPF依賴屬性
依賴屬性是一種可以自己沒有值,並能通過使用binding從資料來源獲取值 依賴在別人身上 的屬性。優點 wpf的所有控制項都是依賴屬性。依賴物件被dependencyobject類實現,依賴屬性由dependencyproperty類實現。dependencyobject有getvalue setv...
WPF 依賴屬性
屬性是我們再熟悉不過的了,那麼究竟依賴屬性怎麼寫呢?依賴屬性和屬性到底有什麼區別和聯絡呢?其實依賴屬性的實現很簡單,只要做以下步驟就可以實現 第一步 讓所在型別繼承自 dependencyobject基類,在wpf中,我們仔細觀察框架的類圖結構,你會發現幾乎所有的 wpf 控制項都間接繼承自depe...