/// <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);
        }
예제 #3
0
        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);
        }
예제 #4
0
        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();
        }
예제 #5
0
 // ToReactiveProperty Only
 internal ReactiveProperty(IObservable <T> source, T initialValue = default(T), ReactivePropertyMode mode = ReactivePropertyMode.DistinctUntilChanged | ReactivePropertyMode.RaiseLatestValueOnSubscribe)
     : this(source, UIDispatcherScheduler.Default, initialValue, mode)
 {
 }
예제 #6
0
 /// <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)
 {
 }
예제 #7
0
 /// <summary>PropertyChanged raise on UIDispatcherScheduler</summary>
 public ReactiveProperty(T initialValue = default(T), ReactivePropertyMode mode = ReactivePropertyMode.DistinctUntilChanged | ReactivePropertyMode.RaiseLatestValueOnSubscribe)
     : this(UIDispatcherScheduler.Default, initialValue, mode)
 {
 }
예제 #8
0
 public ApplicationProperty(IScheduler raiseEventScheduler, T initialValue = default(T), ReactivePropertyMode mode = ReactivePropertyMode.DistinctUntilChanged | ReactivePropertyMode.RaiseLatestValueOnSubscribe) :
     base(raiseEventScheduler, initialValue, mode)
 {
 }
예제 #9
0
 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;
 }
예제 #11
0
 /// <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) =>
예제 #13
0
 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));
 }
예제 #14
0
 /// <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);
 }
예제 #17
0
 public ApplicationProperty(T initialValue = default(T), ReactivePropertyMode mode = ReactivePropertyMode.None)
     : this(Scheduler.Immediate, initialValue, mode)
 {
 }