示例#1
0
 /// <summary>
 ///     Crea un handler debil para eventos de tipo <c>EventHandler_v2</c>,
 /// </summary>
 /// <param name="eventHandler">Handler origen.</param>
 /// <param name="unregister">Delegado para deregistrar el evento.</param>
 /// <returns>Handler debil.</returns>
 public static IWeakEventHandler <EventHandler_v2 <T> > MakeWeak <T>(
     this EventHandler_v2 <T> eventHandler,
     UnregisterCallback <EventHandler_v2 <T> > unregister)
     where T : EventArgs
 {
     return(MakeWeak <EventHandler_v2 <T>, T>(eventHandler, unregister));
 }
        public void Test1()
        {
            WeakEventHandlerManager manager = new WeakEventHandlerManager();

            int[] eventCount_delegate = new int[1];
            EventHandler_v2 <ListEventArgs> count_delegate = (sender, args) =>
            {
                eventCount_delegate[0]++;
            };

            DisposableCounter disposable = new DisposableCounter();

            manager.For <EventList <int> >().RegisterWeak("Count_delegate",
                                                          count_delegate,
                                                          (x, h) => x.ListChanged += h,
                                                          (x, h) => x.ListChanged -= h);

            manager.For <EventList <int> >().RegisterWeak <ListEventArgs>("Count_static",
                                                                          Count_static,
                                                                          (x, h) => x.ListChanged += h,
                                                                          (x, h) => x.ListChanged -= h);

            manager.For <EventList <int> >().RegisterWeak <ListEventArgs>("Count_instance",
                                                                          this.Count_instance,
                                                                          (x, h) => x.ListChanged += h,
                                                                          (x, h) => x.ListChanged -= h);

            manager.For <EventList <int> >().RegisterWeak <ListEventArgs>("Count_disposable",
                                                                          disposable.Count,
                                                                          (x, h) => x.ListChanged += h,
                                                                          (x, h) => x.ListChanged -= h);

            {
                eventCount_delegate[0]   = 0;
                this.eventCount_instance = 0;
                eventCount_static        = 0;

                EventList <int> eventList = new EventList <int>();
                manager.AddWeak("Count_delegate", eventList);
                manager.AddWeak("Count_static", eventList);
                manager.AddWeak("Count_instance", eventList);
                manager.AddWeak("Count_disposable", eventList);

                eventList.Add(0);
                eventList.Add(5);
                eventList.Add(10);
                eventList.Add(15);
                eventList.Add(20);
                eventList = null;
                GC.Collect();
                GC.WaitForPendingFinalizers();

                Debug.WriteLine("eventCount_delegate = " + eventCount_delegate[0]);
                Debug.WriteLine("eventCount_static = " + eventCount_static);
                Debug.WriteLine("eventCount_instance = " + this.eventCount_instance);
                Debug.WriteLine("eventCount_disposable = " + disposable.eventCount_disposable);
            }

            manager.RemoveWeak("ListChanged");
        }
示例#3
0
 /// <summary>
 ///     Gestiona los eventos de multiples propiedades.
 /// </summary>
 public RegisterForImp <TSender> RegisterAllProperties(EventHandler_v2 <PropertyChangedExEventArgs> eventHandler,
                                                       bool valuesToManager = true)
 {
     return(this.RegisterAllProperties(eventHandler,
                                       (sender, h) => sender.PropertyChanged += h,
                                       (sender, h) => sender.PropertyChanged -= h,
                                       valuesToManager));
 }
示例#4
0
 public EventListener_v2(EventHandler_v2 <TEventArgs> eventHandler,
                         RegisterCallback <EventHandler_v2 <TEventArgs> > register,
                         UnregisterCallback <EventHandler_v2 <TEventArgs> > unregister)
 {
     this.register     = register;
     this.unregister   = unregister;
     this.eventHandler = eventHandler;
 }
示例#5
0
 /// <summary>
 ///     Crea un handler debil para eventos de tipo <c>EventHandler_v2</c>,
 /// </summary>
 /// <param name="eventHandler">Handler origen.</param>
 /// <param name="register">Delegado para registrar el evento.</param>
 /// <param name="unregister">Delegado para deregistrar el evento.</param>
 /// <returns>Handler debil.</returns>
 public static IWeakEventHandler <EventHandler_v2 <T> > WeakListen <T>(
     this EventHandler_v2 <T> eventHandler,
     RegisterCallback <EventHandler_v2 <T> > register,
     UnregisterCallback <EventHandler_v2 <T> > unregister)
     where T : EventArgs
 {
     return(WeakListen <EventHandler_v2 <T>, T>(eventHandler, register, unregister));
 }
示例#6
0
 public AllPropertiesListener(EventHandler_v2 <PropertyChangedExEventArgs> eventHandler,
                              RegisterCallback <EventHandler_v2 <PropertyChangedExEventArgs> > register,
                              UnregisterCallback <EventHandler_v2 <PropertyChangedExEventArgs> > unregister,
                              bool valuesToManager)
     : base(eventHandler, register, unregister)
 {
     this.ValuesToManager = valuesToManager;
 }
 public ForSource <TSource> RegisterWeak <TEventArgs>(string name,
                                                      EventHandler_v2 <TEventArgs> eventHandler,
                                                      RegisterCallback <TSource, EventHandler_v2 <TEventArgs> > register,
                                                      UnregisterCallback <TSource, EventHandler_v2 <TEventArgs> > unregister)
     where TEventArgs : EventArgs
 {
     this.manager.RegisterWeak <TSource, EventHandler_v2 <TEventArgs>, TEventArgs>(name, eventHandler, register, unregister);
     return(this);
 }
示例#8
0
 /// <summary>
 ///     Gestiona los eventos de una propiedad.
 /// </summary>
 public RegisterForImp <TSender> RegisterProperty <TItem>(string propertyName, Func <TSender, TItem> getValue,
                                                          EventHandler_v2 <PropertyChangedExEventArgs> eventHandler,
                                                          bool valuesToManager = true)
 {
     return(this.RegisterProperty(propertyName, getValue, eventHandler,
                                  (sender, h) => sender.PropertyChanged += h,
                                  (sender, h) => sender.PropertyChanged -= h,
                                  valuesToManager));
 }
示例#9
0
 /// <summary>
 ///     Gestiona los eventos de una lista.
 /// </summary>
 public RegisterForImp <TSender> RegisterList <TItem>(Func <TSender, IEventList <TItem> > getValues,
                                                      EventHandler_v2 <ListEventArgs> eventHandler,
                                                      bool valuesToManager = true)
 {
     return(this.RegisterList(getValues,
                              eventHandler,
                              (sender, h) => getValues(sender).ListChanged += h,
                              (sender, h) => getValues(sender).ListChanged -= h,
                              valuesToManager));
 }
示例#10
0
 /// <summary>
 ///     Gestiona los eventos de una coleccion.
 /// </summary>
 public RegisterForImp <TSender> RegisterCollection <TItem>(Func <TSender, IEventCollection <TItem> > getValues,
                                                            EventHandler_v2 <CollectionEventArgs> eventHandler,
                                                            bool valuesToManager = true)
 {
     return(this.RegisterCollection(getValues,
                                    eventHandler,
                                    (sender, h) => getValues(sender).CollectionChanged += h,
                                    (sender, h) => getValues(sender).CollectionChanged -= h,
                                    valuesToManager));
 }
示例#11
0
 public ListListener(EventHandler_v2 <ListEventArgs> eventHandler,
                     Func <object, IList <TItem> > getValues,
                     RegisterCallback <EventHandler_v2 <ListEventArgs> > register,
                     UnregisterCallback <EventHandler_v2 <ListEventArgs> > unregister,
                     bool valuesToManager)
     : base(eventHandler, register, unregister)
 {
     this.ValuesToManager = valuesToManager;
     this.getValues       = getValues;
 }
示例#12
0
 /// <summary>
 ///     Gestiona los eventos de multiples propiedades.
 /// </summary>
 public RegisterForImp <TSender> RegisterProperties(Type[] propertyTypes, string[] propertyNames, Func <TSender, object>[] getValues,
                                                    EventHandler_v2 <PropertyChangedExEventArgs> eventHandler,
                                                    bool valuesToManager = true)
 {
     return(this.RegisterProperties(propertyTypes,
                                    propertyNames, getValues, eventHandler,
                                    (sender, h) => sender.PropertyChanged += h,
                                    (sender, h) => sender.PropertyChanged -= h,
                                    valuesToManager));
 }
示例#13
0
 /// <summary>
 ///     Gestiona los eventos genericos.
 /// </summary>
 public RegisterForImp <TSender> Register <TEventArgs>(EventHandler_v2 <TEventArgs> eventHandler,
                                                       RegisterCallback <TSender, EventHandler_v2 <TEventArgs> > register,
                                                       UnregisterCallback <TSender, EventHandler_v2 <TEventArgs> > unregister)
     where TEventArgs : EventArgs
 {
     ListenerManager.EventListener_v2 <TEventArgs> listener = new ListenerManager.EventListener_v2 <TEventArgs>(eventHandler,
                                                                                                                (sender, h) => register((TSender)sender, h),
                                                                                                                (sender, h) => unregister((TSender)sender, h));
     this.manager.Add <TSender>(listener);
     return(this);
 }
示例#14
0
 public RegisterForImp <TSender> RegisterProperties(Tuple <Type, string, Func <TSender, object> >[] properties,
                                                    EventHandler_v2 <PropertyChangedExEventArgs> eventHandler,
                                                    bool valuesToManager = true)
 {
     return(this.RegisterProperties(properties.Select(x => x.Item1).ToArray(),
                                    properties.Select(x => x.Item2).ToArray(),
                                    properties.Select(x => x.Item3).ToArray(),
                                    eventHandler,
                                    (sender, h) => sender.PropertyChanged += h,
                                    (sender, h) => sender.PropertyChanged -= h,
                                    valuesToManager));
 }
示例#15
0
            /// <summary>
            ///     Gestiona los eventos de multiples propiedades.
            /// </summary>
            public RegisterForImp <TSender> RegisterAllProperties(EventHandler_v2 <PropertyChangedExEventArgs> eventHandler,
                                                                  RegisterCallback <TSender, EventHandler_v2 <PropertyChangedExEventArgs> > register,
                                                                  UnregisterCallback <TSender, EventHandler_v2 <PropertyChangedExEventArgs> > unregister,
                                                                  bool valuesToManager = false)
            {
                ListenerManager.AllPropertiesListener listener = new ListenerManager.AllPropertiesListener(eventHandler,
                                                                                                           (sender, h) => register((TSender)sender, h),
                                                                                                           (sender, h) => unregister((TSender)sender, h),
                                                                                                           valuesToManager);

                this.manager.Add <TSender>(listener);
                return(this);
            }
示例#16
0
 /// <summary>
 ///     Gestiona los eventos de una coleccion.
 /// </summary>
 public RegisterForImp <TSender> RegisterCollection <TItem>(Func <TSender, ICollection <TItem> > getValues,
                                                            EventHandler_v2 <CollectionEventArgs> eventHandler,
                                                            RegisterCallback <TSender, EventHandler_v2 <CollectionEventArgs> > register,
                                                            UnregisterCallback <TSender, EventHandler_v2 <CollectionEventArgs> > unregister,
                                                            bool valuesToManager = true)
 {
     ListenerManager.CollectionListener <TItem> listener = new ListenerManager.CollectionListener <TItem>(eventHandler,
                                                                                                          sender => getValues((TSender)sender),
                                                                                                          (sender, h) => register((TSender)sender, h),
                                                                                                          (sender, h) => unregister((TSender)sender, h),
                                                                                                          valuesToManager);
     this.manager.Add <TSender>(listener);
     return(this);
 }
示例#17
0
            public PropertyListener(Type propertyType,
                                    EventHandler_v2 <PropertyChangedExEventArgs> eventHandler,
                                    string propertyName, Func <object, object> getValue,
                                    RegisterCallback <EventHandler_v2 <PropertyChangedExEventArgs> > register,
                                    UnregisterCallback <EventHandler_v2 <PropertyChangedExEventArgs> > unregister,
                                    bool valuesToManager)
                : base(eventHandler, register, unregister)
            {
                this.PropertyType = propertyType;

                this.ValuesToManager = valuesToManager;
                this.PropertyName    = propertyName;
                this.GetValue        = getValue;
            }
示例#18
0
 public PropertiesListener(EventHandler_v2 <PropertyChangedExEventArgs> eventHandler,
                           Type[] propertyTypes, string[] propertyNames, Func <object, object>[] getValues,
                           RegisterCallback <EventHandler_v2 <PropertyChangedExEventArgs> > register,
                           UnregisterCallback <EventHandler_v2 <PropertyChangedExEventArgs> > unregister,
                           bool valuesToManager)
     : base(eventHandler, register, unregister)
 {
     this.ValuesToManager = valuesToManager;
     this.propertyTypes   = propertyTypes;
     this.propertyNames   = new Dictionary <string, int>();
     for (int i = 0; i < propertyNames.Length; i++)
     {
         this.propertyNames.Add(propertyNames[i], i);
     }
     this.getValues = getValues;
 }
示例#19
0
            /// <summary>
            ///     Gestiona los eventos de multiples propiedades.
            /// </summary>
            public RegisterForImp <TSender> RegisterProperties(Type[] propertyTypes, string[] propertyNames, Func <TSender, object>[] getValues,
                                                               EventHandler_v2 <PropertyChangedExEventArgs> eventHandler,
                                                               RegisterCallback <TSender, EventHandler_v2 <PropertyChangedExEventArgs> > register,
                                                               UnregisterCallback <TSender, EventHandler_v2 <PropertyChangedExEventArgs> > unregister,
                                                               bool valuesToManager = true)
            {
                ListenerManager.PropertiesListener listener = new ListenerManager.PropertiesListener(eventHandler,
                                                                                                     propertyTypes,
                                                                                                     propertyNames,
                                                                                                     getValues.Select(getValue => (Func <object, object>)(sender => getValue((TSender)sender))).ToArray(),
                                                                                                     (sender, h) => register((TSender)sender, h),
                                                                                                     (sender, h) => unregister((TSender)sender, h),
                                                                                                     valuesToManager);

                this.manager.Add <TSender>(listener);
                return(this);
            }
示例#20
0
            /// <summary>
            ///     Gestiona los eventos de una propiedad.
            /// </summary>
            public RegisterForImp <TSender> RegisterProperty <TItem>(string propertyName, Func <TSender, TItem> getValue,
                                                                     EventHandler_v2 <PropertyChangedExEventArgs> eventHandler,
                                                                     RegisterCallback <TSender, EventHandler_v2 <PropertyChangedExEventArgs> > register,
                                                                     UnregisterCallback <TSender, EventHandler_v2 <PropertyChangedExEventArgs> > unregister,
                                                                     bool valuesToManager = true)
            {
                ListenerManager.PropertyListener <TItem> listener = new ListenerManager.PropertyListener <TItem>(eventHandler,
                                                                                                                 propertyName,
                                                                                                                 sender => getValue((TSender)sender),
                                                                                                                 (sender, h) => register((TSender)sender, h),
                                                                                                                 (sender, h) => unregister((TSender)sender, h),
                                                                                                                 valuesToManager);

                foreach (ListenerManager.Listener aux in this.manager.FindListenersOfExactType(typeof(TSender)))
                {
                    if (aux is ListenerManager.PropertyListener)
                    {
                        ListenerManager.PropertyListener aux2 = (ListenerManager.PropertyListener)aux;
                        if (aux2.Compatible(listener))
                        {
                            ListenerManager.PropertiesListener newListener = ListenerManager.PropertiesListener.Join(aux2, listener);
                            this.manager.Remove <TSender>(aux2);
                            this.manager.Add <TSender>(newListener);
                            return(this);
                        }
                    }
                    else if (aux is ListenerManager.PropertiesListener)
                    {
                        ListenerManager.PropertiesListener aux2 = (ListenerManager.PropertiesListener)aux;
                        if (aux2.Compatible(listener))
                        {
                            ListenerManager.PropertiesListener newListener = ListenerManager.PropertiesListener.Join(aux2, listener);
                            this.manager.Remove <TSender>(aux2);
                            this.manager.Add <TSender>(newListener);
                            return(this);
                        }
                    }
                }

                this.manager.Add <TSender>(listener);
                return(this);
            }
示例#21
0
 public void Add(EventHandler_v2 <PropertyChangedExEventArgs> eventHandler, string propertyName, Func <object, TItem> getValue)
 {
     this.partials.Add(propertyName, new Partial(propertyName, eventHandler, getValue));
 }
示例#22
0
 public Partial(string propertyName, EventHandler_v2 <PropertyChangedExEventArgs> eventHandler, Func <object, TItem> getValue)
 {
     this.PropertyName    = propertyName;
     this.EventHandler_v2 = eventHandler;
     this.GetValue        = getValue;
 }