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