public EventBinder(DXEventExtension owner, Type eventHandlerType, BindingBase binding)
 {
     lock (locker) {
         this.errorHandler = owner.ErrorHandler;
         this.calculator   = owner.Calculator;
         var target = (DependencyObject)owner.TargetProvider.TargetObject;
         this.targetObject     = new WeakReference(target);
         this.eventHandlerType = eventHandlerType;
         var dataPropertyInfo = Tuple.Create(target.GetType(), owner.Handler);
         if (!propertiesCache.TryGetValue(dataPropertyInfo, out dataProperty))
         {
             dataProperty = DependencyProperty.Register(
                 "Tag" + dataPropertyIndex++.ToString(), typeof(object), dataPropertyInfo.Item1);
             propertiesCache[dataPropertyInfo] = dataProperty;
         }
         try {
             BindingOperations.SetBinding(target, dataProperty, binding);
         } catch (Exception e) {
             string message = "DXEvent cannot set binding on data property. " + Environment.NewLine
                              + "Expr: " + owner.Handler + Environment.NewLine
                              + "TargetProperty: " + owner.TargetPropertyName + Environment.NewLine
                              + "TargetPropertyType: " + owner.TargetPropertyType.ToString() + Environment.NewLine
                              + "TargetObjectType: " + target.GetType() + Environment.NewLine
                              + "DataProperty: " + dataProperty.Name;
             throw new DXEventException(owner, message, e);
         }
     }
 }
 protected override void Init()
 {
     TreeInfo = new EventTreeInfo(Handler, ErrorHandler);
     if (ActualResolvingMode == DXBindingResolvingMode.LegacyStaticTyping)
     {
         Calculator = new EventCalculator(TreeInfo);
     }
     else
     {
         Calculator = new EventCalculatorDynamic(TreeInfo);
     }
     Calculator.Init(TypeResolver);
 }