private void privatemethod(T @object, string childrenpath, IObservable <bool> ischecked, IObservable <bool> expand, bool hasinterface) { IEnumerable <T> children = null; if (hasinterface) { children = (@object as IParent <T>).Children; } else { children = @object.GetPropertyValue <IEnumerable>(childrenpath)?.Cast <T>(); } if (children != null) { collection = new InteractiveCollectionViewModel <T>(children, childrenpath, ischecked, this.WhenPropertyChanged(a => a.IsExpanded).Select(b => b.Value).Where(c => c == true).Select(a => (bool)a).Take(1)); collection.ChildSubject.Subscribe(_a => ChildChanged = _a); collection.Interactions /*.Merge(collection.ChildSubject)*/.Subscribe(_a => ChildChanged = _a); OnPropertyChanged(nameof(Children)); } }
public virtual InteractiveCollectionViewModel <object, IConvertible> React(/*string key,*/ string childrenpath, IEnumerable enumerable, IObservable <bool> ischecked, System.Reactive.Concurrency.DispatcherScheduler UI, System.Windows.Threading.Dispatcher dispatcher) { var sx = ObservableChangeSet.Create <object, IConvertible>(cache => { foreach (var val in enumerable) { cache.AddOrUpdate(val); } return(System.Reactive.Disposables.Disposable.Empty); }, GetKey); var kx = new InteractiveCollectionViewModel <object, IConvertible>(sx, ChildrenPath, ischecked, ExpandSubject.StartWith(Expand).DistinctUntilChanged()); kx.GetChecked(); kx.GetSelectedItem(ischecked).Subscribe(_ => { Dispatcher.InvokeAsync(() => SelectedItem = _, System.Windows.Threading.DispatcherPriority.Background, default); }); kx.SelectCheckedChildItems(ischecked, childrenpath).Subscribe(_ => { Dispatcher.InvokeAsync(() => CheckedItems = _, System.Windows.Threading.DispatcherPriority.Background, default); }); AllCheckedItems = kx.Checked; //kx.GetSelected().WithLatestFrom(ischecked,(a,b)=>new { a, b }).Subscribe(_=> //{ // if (@checked.Contains(_) || _.b==false) // { // this.Dispatcher.InvokeAsync(() => SelectedItem = _.a, System.Windows.Threading.DispatcherPriority.Background, default(System.Threading.CancellationToken)); // this.Dispatcher.InvokeAsync(() => CheckedItems = ReflectionHelper.RecursivePropValues(_.a, childrenpath).Cast<object>().Where(a => @checked.Contains(a)).ToList(), System.Windows.Threading.DispatcherPriority.Background, default(System.Threading.CancellationToken)); // } //}); //kx.ChildSubject.Where(_=>_.Value.Interaction==Interaction.Select &&((int) _.Value.Value)>0).WithLatestFrom(ischecked, (a, b) => new { a, b }).Subscribe(_ => //{ // if (@checked.Contains(_.a.Key) || _.b == false) // { // this.Dispatcher.InvokeAsync(() => SelectedItem = _.a.Key, System.Windows.Threading.DispatcherPriority.Background, default(System.Threading.CancellationToken)); // this.Dispatcher.InvokeAsync(() => CheckedItems = ReflectionHelper.RecursivePropValues(_.a.Key, childrenpath).Cast<object>().Where(a => @checked.Contains(a)).ToList(), System.Windows.Threading.DispatcherPriority.Background, default(System.Threading.CancellationToken)); // } //}); //kx.ChildSubject.Where(_ => _.Value.Interaction == Interaction.Check).Subscribe(_ => //{ // if (!((bool)_.Value.Value)) // if (@checked.Contains(_.Key)) // { // @checked.Remove(_.Key); // this.Dispatcher.InvokeAsync(() => SelectedItem = null, System.Windows.Threading.DispatcherPriority.Background, default(System.Threading.CancellationToken)); // this.Dispatcher.InvokeAsync(() => CheckedItems = null, System.Windows.Threading.DispatcherPriority.Background, default(System.Threading.CancellationToken)); // } // else if (((bool)_.Value.Value)) // if (@unchecked.Contains(_.Key)) // { // @unchecked.Remove(_.Key); // this.Dispatcher.InvokeAsync(() => SelectedItem = _.Key, System.Windows.Threading.DispatcherPriority.Background, default(System.Threading.CancellationToken)); // this.Dispatcher.InvokeAsync(() => CheckedItems = ReflectionHelper.RecursivePropValues(_.Key, childrenpath).Cast<object>().Where(a => @checked.Contains(a)).ToList(), System.Windows.Threading.DispatcherPriority.Background, default(System.Threading.CancellationToken)); // } //}); //kx.DoubleClicked.Subscribe(_ => //{ // this.Dispatcher.InvokeAsync(() => DoubleClickedItem = _, System.Windows.Threading.DispatcherPriority.Background, default(System.Threading.CancellationToken)); //}); //SelectedItemSubject.Subscribe(_ => //kx.Deleted.Subscribe(_ => //{ // this.Dispatcher.InvokeAsync(() => Deleted = _, System.Windows.Threading.DispatcherPriority.Background, default(System.Threading.CancellationToken)); //}); return(kx); }