public class DependencyProperty { public static Dictionary<Object, DependencyProperty> Dic = new Dictionary<object, DependencyProperty>(); public string name; public object defaultvalue; public object Hashcode; private DependencyProperty(string name, object value, Type propType, Type owenerType) { this.name = name; this.defaultvalue = value; this.Hashcode = propType.GetHashCode() ^ owenerType.GetHashCode(); } public static DependencyProperty Register(string name, object value, Type propType, Type owenerType) { DependencyProperty p = new DependencyProperty(name, value, propType, owenerType); Dic.Add(p.Hashcode, p); return p; } }
public class DependencyObject { public static DependencyProperty NameProperty = DependencyProperty.Register("Name", "shenwei", typeof(string), typeof(DependencyObject)); public static DependencyProperty AgeProperty = DependencyProperty.Register("Age", 23, typeof(int), typeof(DependencyObject)); public Object GetValue(DependencyProperty d) { return DependencyProperty.Dic[d.Hashcode]; } public void SetValue(DependencyProperty d, object value) { DependencyProperty.Dic[d.Hashcode].defaultvalue = value; //現在的情況是 設置的屬性值是默認值。 那接下來所有實例的這個屬性的默認值都應該是這個。但是現在的代碼 實際上一個實例修改 ,所有的實例都會修改。 那我們這邊的setValue就不能這么寫。我們還需要一個單獨服務于 實例的字典。 } }
這個是我們模擬的第一步,目前我們所做的就是建立一個靜態字典,然后向其中插入數據
插入的值時一個 dependencyProperty對象,插入的鍵很有意思,是由DependencyProperty本身的 數據類型以及擁有這個屬性的類的類型共同決定
由這兩者本身的hashcode異或組成了這個依賴屬性的hashcode 作為鍵值存儲在靜態字典中。
但是這樣子,一個實例的屬性弱發生變化,這個類的所有實例的這個以來屬性都會發生變化,很顯然這是 荒唐的。 這邊只 是針對這個屬性的默認值的情況。
在DependencyObject里面添加了一個實例字典,來存儲實例的屬性值,避免了一個實例屬性改,所有都改的尷尬。
public class DependencyObject { public static DependencyProperty NameProperty = DependencyProperty.Register("Name", typeof(string), typeof(DependencyObject), "shenwei"); public static DependencyProperty AgeProperty = DependencyProperty.Register("Age", typeof(int), typeof(DependencyObject), 23); //小旅行包 private Dictionary<object, object> Dic_for_instance_propertyValue = new Dictionary<object, object>(); //鍵值就采用的DependencyProperty的鍵值,因為這個實例字典是屬于實例自己的,所以無需擔心重復。 public object GetValue(DependencyProperty p) { if (Dic_for_instance_propertyValue.ContainsKey(p.hashcode)) { return Dic_for_instance_propertyValue[p.hashcode]; //返回實例的屬性具體值 } return DependencyProperty.Dic_Dps[p.hashcode].property_default_value; //返回屬性默認值 } public void SetValue(DependencyProperty p, object pro_value) { Dic_for_instance_propertyValue[p.hashcode] = pro_value; } public string Name { get { return this.GetValue(DependencyObject.NameProperty).ToString(); } set { SetValue(NameProperty, value); } } public int Age { get { return (Int32)(this.GetValue(DependencyObject.AgeProperty)); } set { SetValue(AgeProperty, value); } } }
如果 依賴屬性系統單單只是為了 優化一下內存,那其實個人認為 并沒有什么必要這么大費周章,所以依賴屬性的功能并不是體現在此,而是體現在屬性更改通知等。
我們現在添加屬性更改通知功能
public delegate void PropertyChangedCallBack(); public class PropertyMetaData { public PropertyChangedCallBack PropertyChanged; public PropertyMetaData(PropertyChangedCallBack para) { PropertyChanged = para; } }
然后,與DependencyProperty相結合,就可以實現屬性更改通知功能了。詳細我們也就不鋪開陳述了。
借助于依賴屬性,WPF構建了強大的屬性系統,可以支持數據綁定、樣式、附加屬性等功能。我們手動簡單的模仿了一下以來屬性系統的大致實現,當然,具體肯定和WPF的實現還有不小的偏差。
新聞熱點
疑難解答