private void Init() { var keyObservable = KeySubject.DistinctUntilChanged() .Merge(DataSubject .Select(_ => GetKey(_)) .Where(_ => _ != null)) .DistinctUntilChanged(); ReplaySubject <Unit> one = new ReplaySubject <Unit>(); ReplaySubject <Unit> two = new ReplaySubject <Unit>(); Build(keyObservable) .ObserveOnDispatcher() .Subscribe(a => { interactiveCollectionBase = a; one.OnNext(Unit.Default); }); GroupSubject.Where(a => a != null).Take(1) .Subscribe(a => { BuildGroup(keyObservable) .ObserveOnDispatcher() .Subscribe(a => { interactivecollectionGroupBase = a; two.OnNext(Unit.Default); }); }); GroupSubject.Subscribe(g => { if (g == null) { one.Take(1).CombineLatest(InteractiveCollectionBaseSubject.Where(a => a == null), (a, b) => (a, b)).Subscribe(a => CollectionChanged(interactiveCollectionBase)); } else { two.Take(1).Subscribe(a => CollectionChanged(interactivecollectionGroupBase)); } }); InteractiveCollectionBaseSubject .Where(a => a != null) .Subscribe(a => { interactiveCollectionBase = a; CollectionChanged(interactiveCollectionBase); }); }
private void CollectionChanged(InteractiveCollectionBase <object> interactiveCollection) { ItemsSource = interactiveCollection.Items; interactiveCollection.SelectDoubleClicked().Subscribe(a => Dispatcher.InvokeAsync(() => DoubleClickedItem = a, System.Windows.Threading.DispatcherPriority.Background, default)); interactiveCollection.SelectSelected().Subscribe(a => Dispatcher.InvokeAsync(() => SelectedItem = a, System.Windows.Threading.DispatcherPriority.Background, default)); interactiveCollection.SelectRemoved().Subscribe(a => Dispatcher.InvokeAsync(() => Deleted = a, System.Windows.Threading.DispatcherPriority.Background, default)); interactiveCollection.Changes.Subscribe(a => { changes.OnNext(a); changeCollection.Add(a); }); Dispatcher.InvokeAsync(() => AllChanges = changeCollection, System.Windows.Threading.DispatcherPriority.Background, default); Dispatcher.InvokeAsync(() => Checked = interactiveCollection.Checked, System.Windows.Threading.DispatcherPriority.Background, default); }