private void SetValue(T value) { LatestValue = value; ValidationTrigger.OnNext(value); Source.OnNext(value); RaiseEventScheduler.Schedule(() => PropertyChanged?.Invoke(this, SingletonPropertyChangedEventArgs.Value)); }
private void SetValue(T value) { LatestValue = value; if (!IsDisposed) { ValidationTrigger.OnNext(value); OnNextAndRaiseValueChanged(ref value); } }
internal ReactiveProperty( IObservable <T> source, IScheduler raiseEventScheduler, T initialValue = default(T), ReactivePropertyMode mode = ReactivePropertyMode.DistinctUntilChanged | ReactivePropertyMode.RaiseLatestValueOnSubscribe) { this.LatestValue = initialValue; this.RaiseEventScheduler = raiseEventScheduler; // create source var merge = source.Merge(AnotherTrigger); if (mode.HasFlag(ReactivePropertyMode.DistinctUntilChanged)) { merge = merge.DistinctUntilChanged(); } merge = merge.Do(x => { // setvalue immediately if (!IsValueChanged) { IsValueChanged = true; } LatestValue = x; }); // publish observable var connectable = (mode.HasFlag(ReactivePropertyMode.RaiseLatestValueOnSubscribe)) ? merge.Publish(initialValue) : merge.Publish(); this.Source = connectable.AsObservable(); this.ValidationTrigger = mode.HasFlag(ReactivePropertyMode.RaiseLatestValueOnSubscribe) ? (ISubject <T>) new BehaviorSubject <T>(initialValue) : (ISubject <T>) new Subject <T>(); connectable.Subscribe(x => ValidationTrigger.OnNext(x)); // raise notification this.RaiseSubscription = connectable .ObserveOn(raiseEventScheduler) .Subscribe(x => this.PropertyChanged?.Invoke(this, SingletonPropertyChangedEventArgs.Value)); // start source this.SourceDisposable = connectable.Connect(); this.ErrorsTrigger = new BehaviorSubject <IEnumerable>(this.GetErrors(null)); }
/// <summary> /// Invoke validation process. /// </summary> public void ForceValidate() => ValidationTrigger.OnNext(LatestValue);