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的实现还有不小的偏差。
新闻热点
疑难解答