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; }
//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; }
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)); } }); }