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); } }
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); }
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); }
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; }
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); }
private string GetParamCode(ObservedProperty observedProperty) { return(observedProperty.CustomId.Split('-')[0].Trim()); }