/// <summary> /// Performs application-defined tasks associated with freeing, releasing, or resetting /// unmanaged resources. /// </summary> public void Dispose() { if (IsDisposed) { return; } var node = _root; _root = _last = null; _mode = (ReactivePropertyMode)IsDisposedFlagNumber; while (node != null) { node.OnCompleted(); node = node.Next; } _sourceSubscription?.Dispose(); _sourceSubscription = null; }
/// <summary> /// <para>Converts NotificationObject's property to ReactiveProperty. Value is two-way synchronized.</para> /// <para>PropertyChanged raise on selected scheduler.</para> /// </summary> /// <param name="propertySelector">Argument is self, Return is target property.</param> /// <param name="convert">Convert selector to ReactiveProperty.</param> /// <param name="convertBack">Convert selector to source.</param> /// <param name="mode">ReactiveProperty mode.</param> /// <param name="ignoreValidationErrorValue">Ignore validation error value.</param> public static ReactiveProperty <TResult> ToReactivePropertyAsSynchronized <TSubject, TProperty, TResult>( this TSubject subject, Expression <Func <TSubject, TProperty> > propertySelector, Func <TProperty, TResult> convert, Func <TResult, TProperty> convertBack, IScheduler raiseEventScheduler, ReactivePropertyMode mode = ReactivePropertyMode.DistinctUntilChanged | ReactivePropertyMode.RaiseLatestValueOnSubscribe, bool ignoreValidationErrorValue = false) where TSubject : INotifyPropertyChanged { string propertyName; // no use var setter = AccessorCache <TSubject> .LookupSet(propertySelector, out propertyName); var result = subject.ObserveProperty(propertySelector, isPushCurrentValueAtFirst: true) .Select(convert) .ToReactiveProperty(raiseEventScheduler, mode: mode); result .Where(_ => !ignoreValidationErrorValue || !result.HasErrors) .Select(convertBack) .Subscribe(x => setter(subject, x)); return(result); }
internal ReadOnlyReactiveProperty( IObservable <T> source, T initialValue = default(T), ReactivePropertyMode mode = ReactivePropertyMode.DistinctUntilChanged | ReactivePropertyMode.RaiseLatestValueOnSubscribe, IScheduler eventScheduler = null) { this.LatestValue = initialValue; var ox = mode.HasFlag(ReactivePropertyMode.DistinctUntilChanged) ? source.DistinctUntilChanged() : source; ox.Do(x => { this.LatestValue = x; this.InnerSource.OnNext(x); }) .ObserveOn(eventScheduler ?? UIDispatcherScheduler.Default) .Subscribe(_ => { this.PropertyChanged?.Invoke(this, SingletonPropertyChangedEventArgs.Value); }) .AddTo(this.Subscription); this.IsRaiseLatestValueOnSubscribe = mode.HasFlag(ReactivePropertyMode.RaiseLatestValueOnSubscribe); }
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(); // raise notification this.raiseSubscription = connectable .ObserveOn(raiseEventScheduler) .Subscribe(x => { var handler = PropertyChanged; if (handler != null) { PropertyChanged(this, SingletonPropertyChangedEventArgs.Value); } }); // start source this.sourceDisposable = connectable.Connect(); }
// ToReactiveProperty Only internal ReactiveProperty(IObservable <T> source, T initialValue = default(T), ReactivePropertyMode mode = ReactivePropertyMode.DistinctUntilChanged | ReactivePropertyMode.RaiseLatestValueOnSubscribe) : this(source, UIDispatcherScheduler.Default, initialValue, mode) { }
/// <summary>PropertyChanged raise on selected scheduler</summary> public ReactiveProperty(IScheduler raiseEventScheduler, T initialValue = default(T), ReactivePropertyMode mode = ReactivePropertyMode.DistinctUntilChanged | ReactivePropertyMode.RaiseLatestValueOnSubscribe) : this(Observable.Never <T>(), raiseEventScheduler, initialValue, mode) { }
/// <summary>PropertyChanged raise on UIDispatcherScheduler</summary> public ReactiveProperty(T initialValue = default(T), ReactivePropertyMode mode = ReactivePropertyMode.DistinctUntilChanged | ReactivePropertyMode.RaiseLatestValueOnSubscribe) : this(UIDispatcherScheduler.Default, initialValue, mode) { }
public ApplicationProperty(IScheduler raiseEventScheduler, T initialValue = default(T), ReactivePropertyMode mode = ReactivePropertyMode.DistinctUntilChanged | ReactivePropertyMode.RaiseLatestValueOnSubscribe) : base(raiseEventScheduler, initialValue, mode) { }
public ApplicationProperty(IScheduler raiseEventScheduler, T initialValue = default(T), ReactivePropertyMode mode = ReactivePropertyMode.None) : base(raiseEventScheduler, initialValue, mode) { }
/// <summary> /// Initializes a new instance of the <see cref="ReactivePropertySlim{T}"/> class. /// </summary> /// <param name="initialValue">The initial value.</param> /// <param name="mode">The mode.</param> /// <param name="equalityComparer">The equality comparer.</param> public ReactivePropertySlim(T initialValue = default(T), ReactivePropertyMode mode = ReactivePropertyMode.Default, IEqualityComparer <T> equalityComparer = null) { latestValue = initialValue; this.mode = mode; this.equalityComparer = equalityComparer ?? EqualityComparer <T> .Default; }
/// <summary> /// Initializes a new instance of the <see cref="ReadOnlyReactivePropertySlim{T}"/> class. /// </summary> /// <param name="source">The source.</param> /// <param name="initialValue">The initial value.</param> /// <param name="mode">The mode.</param> /// <param name="equalityComparer">The equality comparer.</param> public ReadOnlyReactivePropertySlim(IObservable <T> source, T initialValue = default, ReactivePropertyMode mode = ReactivePropertyMode.DistinctUntilChanged | ReactivePropertyMode.RaiseLatestValueOnSubscribe, IEqualityComparer <T> equalityComparer = null) { _latestValue = initialValue; _mode = mode; _equalityComparer = equalityComparer ?? EqualityComparer <T> .Default; _sourceSubscription = source.Subscribe(this); if (IsDisposed) { _sourceSubscription.Dispose(); _sourceSubscription = null; } }
/// <summary> /// Create ReadOnlyReactiveProperty from DependencyObject /// </summary> public static ReadOnlyReactiveProperty <T> ToReadOnlyReactiveProperty <T>(this DependencyObject self, DependencyProperty dp, ReactivePropertyMode mode = ReactivePropertyMode.DistinctUntilChanged | ReactivePropertyMode.RaiseLatestValueOnSubscribe, IScheduler eventScheduler = null) =>
public static ReadonlyReactiveProperty <T> ToReadonlyReactiveProperty <T>(this IObservable <T> source, T initialValue = default(T), ReactivePropertyMode mode = ReactivePropertyMode.DistinctUntilChanged | ReactivePropertyMode.RaiseLatestValueOnSubscribe) { return(new ReadonlyReactiveProperty <T>(source, initialValue, mode)); }
/// <summary>PropertyChanged raise on selected scheduler</summary> protected ReactivePropertyBase(IScheduler raiseEventScheduler, T initialValue = default(T), ReactivePropertyMode mode = ReactivePropertyMode.DistinctUntilChanged | ReactivePropertyMode.RaiseLatestValueOnSubscribe) : this(System.Reactive.Linq.Observable.Never <T>(), raiseEventScheduler, initialValue, mode) { }
public ReactivePropertySlim(T initialValue = default(T), ReactivePropertyMode mode = ReactivePropertyMode.DistinctUntilChanged | ReactivePropertyMode.RaiseLatestValueOnSubscribe, IEqualityComparer <T> equalityComparer = null) { this.latestValue = initialValue; this.mode = mode; this.equalityComparer = equalityComparer ?? EqualityComparer <T> .Default; }
public ReadOnlyReactivePropertySlim(IObservable <T> source, T initialValue = default(T), ReactivePropertyMode mode = ReactivePropertyMode.DistinctUntilChanged | ReactivePropertyMode.RaiseLatestValueOnSubscribe, IEqualityComparer <T> equalityComparer = null) { this.latestValue = initialValue; this.mode = mode; this.equalityComparer = equalityComparer ?? EqualityComparer <T> .Default; this.sourceSubscription = source.Subscribe(this); }
public ApplicationProperty(T initialValue = default(T), ReactivePropertyMode mode = ReactivePropertyMode.None) : this(Scheduler.Immediate, initialValue, mode) { }