コード例 #1
0
        /// <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);
        }
コード例 #2
0
 /// <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);
 }
コード例 #3
0
        /// <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));
        }
コード例 #4
0
        /// <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);
        }
コード例 #5
0
 /// <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);
     }
 }
コード例 #6
0
        /// <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;
            }
        }
コード例 #7
0
        /// <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);
            }
        }
コード例 #8
0
 /// <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);
 }
コード例 #9
0
 /// <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);
 }
コード例 #10
0
 /// <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));
 }
コード例 #11
0
 /// <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));
 }
コード例 #12
0
ファイル: WeakEvent.cs プロジェクト: zhouyongh/BindingEngine
        /// <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;
        }
コード例 #13
0
ファイル: WeakEvent.cs プロジェクト: zhouyongh/BindingEngine
        /// <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);
        }
コード例 #14
0
ファイル: WeakEvent.cs プロジェクト: zhouyongh/BindingEngine
        /// <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);
            }
        }
コード例 #15
0
ファイル: WeakEvent.cs プロジェクト: zhouyongh/BindingEngine
 /// <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);
 }