Пример #1
0
 public void Invoke(NotifiableObject notifier, PropertyChangedEventArgsEx args, PropertyChangeEvent eventType)
 {
     if (notifier != null)
     {
         if (this.ContainsKey(notifier) && this[notifier] != null)
         {
             foreach (var handlers in this[notifier].Where(item => item.Item1 == args.PropertyName))
             {
                 //changing handler[1]
                 if (eventType == PropertyChangeEvent.Changing)
                 {
                     if (handlers.Item2 != null)
                     {
                         handlers.Item2(notifier, args);
                     }
                 }
                 else
                 {
                     if (handlers.Item3 != null)
                     {
                         handlers.Item3(notifier, args);
                     }
                 }
             }
         }
     }
 }
Пример #2
0
        private void InvokeEventAndRepositoryRegisterHandlers(PropertyChangedEventArgsEx args, PropertyChangeEvent period)
        {
            //var repository = period == PropertyChangeEvent.Changing ? _notifiedChangingRepository : _notifiedChangedRepository;
            var commonEvent = period == PropertyChangeEvent.Changing ? PropertyChangingEx : PropertyChangedEx;
            var eventName   = period == PropertyChangeEvent.Changed ? "Changed" : "Changing";
            var stackitem   = new KeyValuePair <NotifiableObject, string>(this, args.PropertyName);

            try
            {
                if (!_eventStack.Contains(stackitem))
                {
                    _eventStack.Push(stackitem);
                    if (commonEvent != null)
                    {
                        commonEvent(this, args);
                    }
                    else
                    {
                        Logger.InfoFormat("{0} change property {1} again, {2} event don't be raised.", this.GetType().BaseType.FullName, args.PropertyName, eventName);
                    }
                }
                else
                {
                    return;
                }
            }
            catch (PropertyChangeException pce)
            {
                Errors = pce.Errors;
            }
            catch (Exception ex)
            {
                PropertyChangeError error = new PropertyChangeError()
                {
                    Event      = period,
                    Exceptions = new List <Exception>()
                    {
                        ex
                    },
                    PropertyName = args.PropertyName
                };
                Errors.Add(error);
            }
            finally
            {
                if (Errors != null && Errors.Count != 0)
                {
                    Logger.ErrorFormat("Error occur when {0} property {1}", eventName, args.PropertyName);
                }
            }

            _eventStack.Pop();
        }
Пример #3
0
        public object Invoke(IMethodInvocation invocation)
        {
            string propertyName = invocation.Method.Name.Substring(3);

            if (ReadOnlyMode)
            {
                Logger.Debug("notifier is readonly");
                return(invocation.Arguments[0]);
            }

            if (_readonly.Contains(propertyName))
            {
                Logger.DebugFormat("notifier is readonly, property {0} can't change", propertyName);
                return(invocation.Arguments[0]);
            }

            if (invocation.Arguments.Length != 1)
            {
                Logger.Error("only listen the property changing event of an instance, other method not support.");
                throw new Exception("only listen the property changing event of an instance, other method not support.");
            }

            var info     = this.GetType().GetProperty(propertyName);
            var val      = invocation.Arguments[0];
            var oldValue = info.GetValue(this);

            if (val == oldValue)
            {
                Logger.InfoFormat("property {0} of type [{1}] not change, new value equle old value.", propertyName, this.GetType().BaseType.FullName);
                return(val);
            }

            PropertyChangedEventArgsEx args = new PropertyChangedEventArgsEx(propertyName)
            {
                Source     = this,
                NewValue   = invocation.Arguments[0],
                OldValue   = info.GetValue(this),
                UserInited = _initialization == 0,
                UIChanged  = UIChanged
            };
            object rval;

            UIChanged = false;
            RaisePropertyChangingEvent(args);
            rval = invocation.Proceed();
            RaisePropertyChangedEvent(args);

            return(rval);
        }
Пример #4
0
 private void RaisePropertyChangedEvent(PropertyChangedEventArgsEx args)
 {
     InvokeEventAndRepositoryRegisterHandlers(args, PropertyChangeEvent.Changed);
     _notifyManager.RegisterToNotify(this, args.PropertyName);
     HandleErrors();
 }
Пример #5
0
 private void RaisePropertyChangingEvent(PropertyChangedEventArgsEx args)
 {
     InvokeEventAndRepositoryRegisterHandlers(args, PropertyChangeEvent.Changing);
     HandleErrors();
 }
Пример #6
0
        private void Invoke(object notifier, PropertyChangedEventArgsEx args, PropertyChangeEvent eventType)
        {
            var sender = notifier as NotifiableObject;

            _registry.Invoke(sender, args, eventType);
        }
Пример #7
0
 public abstract void HandleError(NotifiableObject source, PropertyChangedEventArgsEx args);