/// <summary> /// The method which will be called for the attached dependency property when the new element is added to a fake collection. /// </summary> /// <param name="dependencyObject">The target FrameworkElement.</param> /// <param name="item">The new object to add.</param> public static void ProcessAddPropertyChangeEventItems(DependencyObject dependencyObject, object item) { if ((item == null) || (dependencyObject == null)) { return; } if (BindHelper.IsInDesignModeStatic) { // Cannot correctly set in the design mode. return; } if (BindHelper.IsInDesignModeStatic) { // Cannot correctly set in the design mode. return; } BindEventHandler bindItem = item as BindEventHandler; if (bindItem == null) { throw new ArgumentException("AddPropertyChangeEvents accepts only BindEventHandlers Type instances "); } if (String.IsNullOrEmpty(bindItem.TargetPropertyName)) { throw new ArgumentException("AddPropertyChangeEvents accepts only BindEventHandlers with set TargetPropertyName"); } var listenDependencyProp = BindHelper.LocateDependencyProperty(bindItem.TargetPropertyName, dependencyObject); if (listenDependencyProp == null) { throw new ArgumentException("AddPropertyChangeEvents cannot obtain proper Type of TargetPropertyName = " + bindItem.TargetPropertyName); } DependencyPropertyDescriptor dependencyPropertyDescriptor = DependencyPropertyDescriptor.FromProperty(listenDependencyProp, listenDependencyProp.OwnerType); if (dependencyPropertyDescriptor == null) { throw new ArgumentException("AddPropertyChangeEvents cannot obtain proper Descriptor of TargetPropertyName = " + bindItem.TargetPropertyName); } var methodInfo = BindHelper.GetMethodInfo(bindItem.Source.GetType(), bindItem.MethodName); Type desiredDelegateType = typeof(EventHandler); var result = methodInfo.CreateDelegate(desiredDelegateType, bindItem.Source); if (result != null) { dependencyPropertyDescriptor.AddValueChanged(dependencyObject, (EventHandler)result); } }