public InteractiveCollectionViewModel(IObservable <IChangeSet <T> > observable,
                                              IObservable <Predicate <T> > invisiblefilter,
                                              IObservable <Predicate <T> > enabledfilter,
                                              IScheduler scheduler, Func <T, IConvertible> getkey = null, string title = null)
        {
            observable.ObserveOn(scheduler)
            .Transform(s =>
            {
                var so = new SHDObject <T>(s, invisiblefilter, enabledfilter, getkey?.Invoke(s));
                this.ReactToChanges(so);
                return((IContain <T>)so);
            })
            .Bind(out _items)

            .DisposeMany()
            .Subscribe(
                _ =>
                Console.WriteLine("generic view model changed"),
                ex =>
            {
                (Errors as ISubject <Exception>).OnNext(ex);
                Console.WriteLine("Error in generic view model");
            });

            Title = title;
        }
Ejemplo n.º 2
0
        //private ReadOnlyObservableCollection<SHDObject<T>> _items;

        public InteractiveCollectionViewModel(IObservableCache <T, R> observable,
                                              IObservable <Predicate <T> > visiblefilter,
                                              IObservable <Predicate <T> > enabledfilter,
                                              IScheduler scheduler, Func <T, IConvertible> getkey = null, string title = null)
        {
            disposable = observable.Connect()
                         .ObserveOn(scheduler)
                         .Transform(s =>
            {
                var so = new SHDObject <T>(s, visiblefilter, enabledfilter, getkey?.Invoke(s));
                this.ReactToChanges(so);
                return((IContain <T>)so);
            })
                         .Bind(out _items)
                         .DisposeMany()
                         .Subscribe(
                _ =>
            {
                foreach (var x in _.Select(a => new KeyValuePair <IContain <T>, ChangeReason>(a.Current, a.Reason)))
                {
                    (Changes as Subject <KeyValuePair <IContain <T>, ChangeReason> >).OnNext(x);
                }
            },
                ex =>
            {
                (Errors as ISubject <Exception>).OnNext(ex);
                Console.WriteLine("Error in generic view model");
            },
                () => Console.WriteLine("observable completed"));

            Title = title;
        }
Ejemplo n.º 3
0
        public InteractiveCollectionViewModel(IObservable <IChangeSet <T, R> > observable, IScheduler scheduler = null, IObservable <T> disable = null, Func <T, IConvertible> getkey = null, string title = null, bool isReadonly = false)
        {
            if (scheduler != null)
            {
                observable = observable.ObserveOn(scheduler);
            }

            disposable = observable

                         .Transform(s =>
            {
                var funcenable = disable?.Scan(new List <T>(), (a, b) => { a.Add(b); return(a); }).Select(_ => { Predicate <T> f = a => !_.Any(b => b.Equals(a)); return(f); });
                var so         = new SHDObject <T>(s, null, funcenable, getkey?.Invoke(s));
                so.IsReadOnly  = isReadonly;
                this.ReactToChanges(so);
                return((IContain <T>)so);
            })
                         .Bind(out _items)
                         .DisposeMany()
                         .Subscribe(
                _ =>
            {
                foreach (var x in _.Select(a => new KeyValuePair <IContain <T>, ChangeReason>(a.Current, a.Reason)))
                {
                    (Changes as Subject <KeyValuePair <IContain <T>, ChangeReason> >).OnNext(x);
                }
            },
                ex =>
            {
                (Errors as ISubject <Exception>).OnNext(ex);
                Console.WriteLine("Error in generic view model");
            },
                () =>
                Console.WriteLine("observable completed"));

            Title = title;
        }
        public static void ReactToChanges <T>(this InteractiveCollectionBase <T> col, SHDObject <T> so)
        {
            //so.IsSelected
            //      .Throttle(TimeSpan.FromMilliseconds(250))
            //         .Subscribe(b =>
            //         {
            //             if (col.Items?.FirstOrDefault(sof =>((SHDObject<T>) sof).IsSelected.Value == true) != (null))
            //                 ((System.Reactive.Subjects.ISubject<T>)col.Selected).OnNext(col.Items.FirstOrDefault(sof => ((SHDObject<T>)sof).IsSelected.Value == true).Object);
            //         });

            so.WhenPropertyChanged(_ => _.IsSelected).Select(_ => _.Value).Buffer(TimeSpan.FromMilliseconds(250)).Where(_ => _.Count > 0).Where(_ => _.All(a => a == true))
            //.Throttle(TimeSpan.FromMilliseconds(250))
            .Subscribe(b =>
            {
                //if (col.Items?.FirstOrDefault(sof => ((SHDObject<T>)sof).IsSelected.Value == true) != (null))
                //{
                //    ((System.Reactive.Subjects.ISubject<T>)col.Selected).OnNext(col.Items.FirstOrDefault(sof => ((SHDObject<T>)sof).IsSelected.Value == true).Object);
                ((System.Reactive.Subjects.ISubject <KeyValuePair <T, InteractionArgs> >)col.Interactions).OnNext(new KeyValuePair <T, InteractionArgs>(so.Object, new InteractionArgs {
                    Interaction = Interaction.Select, Value = b.Count
                }));
            });

            so.WhenPropertyChanged(_ => _.IsExpanded).Select(_ => _.Value).Subscribe(_ =>
            {
                if (_ != null)
                {
                    //((System.Reactive.Subjects.ISubject<T>)col.IsExpanded).OnNext(so == default(SHDObject<T>) ? default(T) : so.Object);
                    ((System.Reactive.Subjects.ISubject <KeyValuePair <T, InteractionArgs> >)col.Interactions).OnNext(new KeyValuePair <T, InteractionArgs>(so.Object, new InteractionArgs {
                        Interaction = Interaction.Expand, Value = _
                    }));
                    ((ISubject <KeyValuePair <IContain <T>, ChangeReason> >)col.Changes).OnNext(new KeyValuePair <IContain <T>, ChangeReason>(so, ChangeReason.Update));
                }
            });

            //so.DoubleClickCommand.Subscribe(_ =>
            //{
            //    ((System.Reactive.Subjects.ISubject<KeyValuePair<T, InteractionArgs>>)col.Interactions).OnNext(new KeyValuePair<T, InteractionArgs>(_, new InteractionArgs { Interaction = Interaction.Click, Value = 2 }));
            //    //((System.Reactive.Subjects.ISubject<T>)col.DoubleClicked).OnNext(so == default(SHDObject<T>) ? default(T) : so.Object);
            //});

            so.Deletions.Subscribe(_ =>
            {
                ((System.Reactive.Subjects.ISubject <UserCommandArgs>)col.UserCommands).OnNext(new UserCommandArgs {
                    UserCommand = UserCommand.Delete, Parameter = so.Object
                });
                //((System.Reactive.Subjects.ISubject<T>)col.Deleted).OnNext(so == default(SHDObject<T>) ? default(T) : so.Object);
            });

            so.WhenPropertyChanged(_ => _.IsChecked).StartWith(new PropertyValue <SHDObject <T>, bool?>(so, so.IsChecked)).Subscribe(_ =>
            {
                if (_.Value != null)
                {
                    ((System.Reactive.Subjects.ISubject <KeyValuePair <T, InteractionArgs> >)col.Interactions).OnNext(new KeyValuePair <T, InteractionArgs>(so.Object, new InteractionArgs {
                        Interaction = Interaction.Check, Value = _.Value
                    }));
                    ((ISubject <KeyValuePair <IContain <T>, ChangeReason> >)col.Changes).OnNext(new KeyValuePair <IContain <T>, ChangeReason>(so, ChangeReason.Update));
                }
            });
        }