public object GetValue(MyDependencyProperty p) { //如果被动画控制,返回动画计算值。(可能会用到p.Name)
//如果有本地值,返回本地值 if (_dict.ContainsKey(p)) { return _dict[p]; }
//如果有Style,则返回Style的值
//返回从可视化树中继承的值
//最后,返回依赖属性的DefaultValue return p.DefaultValue; } /// <summary> /// 设置绑定属性,一样是模拟微软的干活,只不过微软的这个方法不是在依赖对象里实现的, /// 而是在UIElement里实现的. /// </summary> /// <param name="p"></param> /// <param name="Binding"></param> public void SetBinding(MyDependencyProperty p,MyBinding Binding) { MyBinding theOld = null; //需要先将老的绑定找到并记录,因为需要解除挂接. if (_bindings.ContainsKey(p)) { theOld = _bindings[p]; _bindings[p] = Binding; } else { _bindings.Add(p,Binding); } //删除旧的绑定. if (theOld != null) { if (theOld.TargetObject is INotifyPropertyChanged) { ((INotifyPropertyChanged)theOld.TargetObject).PropertyChanged -= new PropertyChangedEventHandler(MyDependencyObject_PropertyChanged); } }
//如果是单向绑定或者双向绑定则需要以下挂接。如果只是Onetime则不必要. if (Binding.TargetObject is INotifyPropertyChanged) { ((INotifyPropertyChanged)Binding.TargetObject).PropertyChanged += new PropertyChangedEventHandler(MyDependencyObject_PropertyChanged); }
} /// <summary> /// 目标属性发生变化时的处理事件方法。 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void MyDependencyObject_PropertyChanged(object sender,PropertyChangedEventArgs e) { MyDependencyProperty p = null; //找到绑定属性所在的依赖属性 foreach (var b in _bindings) { if (b.Value.PropertyName == e.PropertyName) { p = b.Key; break; } } //不为空则处理. if (p != null) { System.Reflection.PropertyInfo thePI = sender.GetType().GetProperty(e.PropertyName); if (thePI != null && thePI.CanRead == true) { object theVal = thePI.GetValue(sender,null); SetValue(p,theVal); //如果目标类INotifyPropertyChanged,绑定模式是ontime,则下面的代码就是要接触与目标属性的挂接. if (sender is INotifyPropertyChanged) { ((INotifyPropertyChanged)sender).PropertyChanged += new PropertyChangedEventHandler(MyDependencyObject_PropertyChanged); } } } } }