/// <summary> /// Attaches the specific event. /// </summary> /// <param name="eventName"> /// The event name. /// </param> /// <param name="handlerName"> /// The handler name. /// </param> /// <param name="filter"> /// The filter. /// </param> /// <returns> /// The <see cref="Delegate"/>. /// </returns> private Delegate AttachEvent(string eventName, string handlerName, WeakEventFilterHandler filter = null) { if (this.targetType == null) { return(null); } this.eventFilter = filter; this.HandlerName = handlerName; EventInfo eventInfo = this.targetType.GetEvent( eventName, BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); if (eventInfo == null) { return(null); // No exception } ParameterExpression sender = Expression.Parameter(typeof(object), "sender"); ParameterExpression args = Expression.Parameter(typeof(EventArgs), "e"); Type eventHandlerType = eventInfo.EventHandlerType; MethodCallExpression body = Expression.Call(Expression.Constant(this), handlerInfo, sender, args); LambdaExpression lambda = Expression.Lambda(eventHandlerType, body, sender, args); Delegate action = lambda.Compile(); MethodInfo addMethod = eventInfo.GetAddMethod(true); addMethod.Invoke(this.BindTarget, new object[] { action }); return(action); }
/// <summary> /// Attaches the specific event. /// </summary> /// <param name="source"> /// The source. /// </param> /// <param name="sourceProperty"> /// The source property. /// </param> /// <param name="eventName"> /// The event name. /// </param> /// <param name="handlerName"> /// The handler name. /// </param> /// <param name="filter"> /// The filter. /// </param> public void AttachEvent( object source, string sourceProperty, string eventName, string handlerName, WeakEventFilterHandler filter = null) { this.AttachEvent(new BindContext(source, sourceProperty), eventName, handlerName, filter); }
/// <summary> /// Attach event to bind source. /// </summary> /// <param name="target"> /// The target. /// </param> /// <param name="property"> /// The property. /// </param> /// <param name="eventName"> /// The event name. /// </param> /// <param name="filter"> /// The filter. /// </param> /// <returns> /// The <see cref="WeakBinding"/>. /// </returns> public WeakBinding AttachSourceEvent( object target, string property, string eventName, WeakEventFilterHandler filter = null) { BindContext bindContext = this.GetBindContext(target, property); return(this.AttachSourceEvent(bindContext, eventName, filter)); }
/// <summary> /// Attaches the specific event. /// </summary> /// <param name="type"> /// The type. /// </param> /// <param name="eventName"> /// The event name. /// </param> /// <param name="handlerName"> /// The handler name. /// </param> /// <param name="filter"> /// The filter. /// </param> public void AttachEvent(Type type, string eventName, string handlerName, WeakEventFilterHandler filter = null) { this.DetachEvent(); this.EventName = eventName; this.Data = null; this.targetType = type; this.eventAction = this.AttachEvent(eventName, handlerName, filter); }
/// <summary> /// Adds the convention. /// </summary> /// <param name="bindMode"> /// The bind mode. /// </param> /// <param name="targetMode"> /// The bind target. /// </param> /// <param name="eventName"> /// Name of the event. /// </param> /// <param name="eventFilter"> /// The event filter. /// </param> protected void AddConvention( BindMode bindMode, TargetMode targetMode, string eventName, WeakEventFilterHandler eventFilter = null) { if ((bindMode & this.bindMode) > 0) { this.AddConvention(targetMode, eventName, eventFilter); } }
/// <summary> /// Adds the convention. /// </summary> /// <param name="targetMode"> /// The target mode. /// </param> /// <param name="eventName"> /// Name of the event. /// </param> /// <param name="eventFilter"> /// The event filter. /// </param> protected void AddConvention(TargetMode targetMode, string eventName, WeakEventFilterHandler eventFilter = null) { switch (targetMode) { case TargetMode.Target: if (!this.TargetEvent.IsAttached) { this.AttachTargetEvent(eventName, eventFilter); } break; case TargetMode.Source: if (!this.SourceEvent.IsAttached) { this.AttachSourceEvent(eventName, eventFilter); } break; } }
/// <summary> /// Attaches the specific event. /// </summary> /// <param name="context"> /// The source. /// </param> /// <param name="eventName"> /// The event name. /// </param> /// <param name="handlerName"> /// The handler name. /// </param> /// <param name="filter"> /// The filter. /// </param> public void AttachEvent( BindContext context, string eventName, string handlerName, WeakEventFilterHandler filter = null) { this.DetachEvent(); context.SourceChanged += this.OnSourceChanged; this.EventName = eventName; this.HandlerName = handlerName; this.Data = context; object value = this.Data.GetTarget(); if (value != null) { this.targetType = value.GetType(); this.eventTarget = new WeakReference(value); this.eventAction = this.AttachEvent(eventName, handlerName, filter); } }
/// <summary> /// Attaches the event to bind source. /// </summary> /// <param name="data"> /// The data. /// </param> /// <param name="eventName"> /// The event name. /// </param> /// <param name="filter"> /// The filter. /// </param> /// <returns> /// The <see cref="WeakBinding"/>. /// </returns> internal WeakBinding AttachSourceEvent(BindContext data, string eventName, WeakEventFilterHandler filter = null) { this.SourceEvent.AttachEvent(data, eventName, SourceEventHandlerName, filter); return(this); }
/// <summary> /// Attach event to bind source. /// </summary> /// <param name="type"> /// The type. /// </param> /// <param name="eventName"> /// The event name. /// </param> /// <param name="filter"> /// The filter. /// </param> /// <returns> /// The <see cref="WeakBinding"/>. /// </returns> public WeakBinding AttachSourceEvent(Type type, string eventName, WeakEventFilterHandler filter = null) { this.SourceEvent.AttachEvent(type, eventName, SourceEventHandlerName, filter); return(this); }
/// <summary> /// Attach event to bind source. /// </summary> /// <param name="eventName"> /// The event name. /// </param> /// <param name="filter"> /// The filter. /// </param> /// <returns> /// The <see cref="WeakBinding"/>. /// </returns> public WeakBinding AttachSourceEvent(string eventName, WeakEventFilterHandler filter = null) { return(this.AttachSourceEvent(this.BindSource, eventName, filter)); }
/// <summary> /// Attach event to bind target. /// </summary> /// <param name="eventName"> /// The event name. /// </param> /// <param name="filter"> /// The filter. /// </param> /// <returns> /// The <see cref="WeakBinding"/>. /// </returns> public WeakBinding AttachTargetEvent(string eventName, WeakEventFilterHandler filter = null) { return(this.AttachTargetEvent(this.BindTarget, eventName, filter)); }
/// <summary> /// Attaches the specific event. /// </summary> /// <param name="eventName"> /// The event name. /// </param> /// <param name="handlerName"> /// The handler name. /// </param> /// <param name="filter"> /// The filter. /// </param> /// <returns> /// The <see cref="Delegate"/>. /// </returns> private Delegate AttachEvent(string eventName, string handlerName, WeakEventFilterHandler filter = null) { if (this.targetType == null) { return null; } this.eventFilter = filter; this.HandlerName = handlerName; EventInfo eventInfo = this.targetType.GetEvent( eventName, BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); if (eventInfo == null) { return null; // No exception } ParameterExpression sender = Expression.Parameter(typeof(object), "sender"); ParameterExpression args = Expression.Parameter(typeof(EventArgs), "e"); Type eventHandlerType = eventInfo.EventHandlerType; MethodCallExpression body = Expression.Call(Expression.Constant(this), handlerInfo, sender, args); LambdaExpression lambda = Expression.Lambda(eventHandlerType, body, sender, args); Delegate action = lambda.Compile(); MethodInfo addMethod = eventInfo.GetAddMethod(true); addMethod.Invoke(this.BindTarget, new object[] { action }); return action; }