Example #1
0
        private void ObserveProperty(PropertyInfo propertyInfo, EventHandler <ObservablePropertyChangedEventArgs> handler)
        {
            ObservedProperty observedProperty;

            if (!_observedProperties.TryGetValue(propertyInfo.Name, out observedProperty))
            {
                observedProperty = new ObservedProperty(propertyInfo);
                observedProperty.CurrentValue = propertyInfo.GetValue(this, null);
                observedProperty.Handlers     = new EventHandler <ObservablePropertyChangedEventArgs> [1];

                _observedProperties = _observedProperties.Add(propertyInfo.Name, observedProperty);
            }

            int idx = 0;

            while (idx < observedProperty.Handlers.Length && observedProperty.Handlers[idx] != null)
            {
                idx++;
            }

            if (idx == observedProperty.Handlers.Length)
            {
                var newHandlers = new EventHandler <ObservablePropertyChangedEventArgs> [idx * 2];
                Array.Copy(observedProperty.Handlers, 0, newHandlers, 0, idx);
                observedProperty.Handlers = newHandlers;
            }

            observedProperty.Handlers[idx] = handler;
        }
        protected override void OnObservedInstanceChanging(INotifyPropertyChanged oldInstance, INotifyPropertyChanged newInstance)
        {
            if (oldInstance != null)
            {
                oldInstance.PropertyChanged -= InvokeCallback;
            }
            if (newInstance != null)
            {
                newInstance.PropertyChanged += InvokeCallback;
            }

            if (_isInitialized)
            {
                PerformInvokeCallback();
            }

            if (newInstance == null)
            {
                _oldValue = default(T);
            }
            else
            {
                _oldValue = (T)ObservedProperty.GetValue(newInstance);
            }
        }
Example #3
0
        public void Callback_Is_Called_On_Direct_Property_Change()
        {
            bool isCallbackCalled = false;
            var  first            = ObservedPropertyModels.CreateFirst("text");

            Action callback = () => isCallbackCalled = true;

            var property = ObservedProperty.Create(() => first.Second.Third.Value, callback);

            first.Second.Third.Value = "new";

            Assert.True(isCallbackCalled);
        }
        private void HandleNextPropertyChanged(object sender, PropertyChangedEventArgs args)
        {
            if (args.PropertyName != ObservedProperty.Name)
            {
                return;
            }
            var newValue = ObservedProperty.GetValue(ObservedInstance);

            if (newValue != null && !(newValue is INotifyPropertyChanged))
            {
                throw new InvalidOperationException();
            }
            NextEntry.Reattach(newValue as INotifyPropertyChanged);
        }
Example #5
0
        public void ObservedProperty_Dispose_Works()
        {
            bool isCallbackCalled = false;
            var  first            = ObservedPropertyModels.CreateFirst("text");

            Action callback = () => isCallbackCalled = true;

            var property = ObservedProperty.Create(() => first.Second.Third.Value, callback);

            property.Dispose();

            first.Second = ObservedPropertyModels.CreateSecond("new1");

            Assert.False(isCallbackCalled);
        }
Example #6
0
        public ObservedPropertyNode(
            MemberExpression expression,
            ObservedProperty observer,
            ObservedPropertyNode?previous)
        {
            ArgumentNullException.ThrowIfNull(expression);
            ArgumentNullException.ThrowIfNull(observer);

            this.objectAccessor = Expression.Lambda(expression.Expression !).Compile();
            this.memberInfo     = expression.Member;
            this.observer       = observer;

            this.previous = previous;

            this.UpdateObject();
        }
        protected virtual void Reattach(INotifyPropertyChanged observedInstance)
        {
            ObservedInstance = observedInstance;

            if (observedInstance == null || NextEntry == null)
            {
                return;
            }

            var nextInstance = ObservedProperty.GetValue(ObservedInstance);

            if (nextInstance != null && !(nextInstance is INotifyPropertyChanged))
            {
                throw new InvalidOperationException();
            }
            NextEntry.Reattach(nextInstance as INotifyPropertyChanged);
        }
        private void PerformInvokeCallback()
        {
            var newValue = ObservedInstance != null ? (T)ObservedProperty.GetValue(ObservedInstance) : default(T);

            if (_oldValue == null && newValue == null)
            {
                return;
            }
            if (_oldValue != null && _oldValue.Equals(newValue))
            {
                return;
            }

            Callback?.Invoke(_oldValue, newValue);

            _oldValue = newValue;
        }
Example #9
0
        public void ObservedProperty_Suppress_Works()
        {
            bool isCallbackCalled = false;
            var  first            = ObservedPropertyModels.CreateFirst("text");

            Action callback = () => isCallbackCalled = true;

            var property = ObservedProperty.Create(() => first.Second.Third.Value, callback);

            using (property.Suppress())
                first.Second = ObservedPropertyModels.CreateSecond("new");

            Assert.False(isCallbackCalled);

            first.Second = ObservedPropertyModels.CreateSecond("new1");

            Assert.True(isCallbackCalled);
        }
Example #10
0
 private string GetParamCode(ObservedProperty observedProperty)
 {
     return(observedProperty.CustomId.Split('-')[0].Trim());
 }