public override void OnActivated()
        {
            base.OnActivated();  // CollectionModuleBase handles activation of common parts
            ShelvesList.Activate();
            BookDetails.Activate();

            UpdateSelectedShelves();

            // Show message if there are no books in the collection
            if (!state_manager.CurrentCollection.Books.Any())
            {
                MessageBus.Current.SendMessage(new InformationMessage("No books in collection, import here", "Go", () => MessageBus.Current.SendMessage(NavigationMessage.Import)));
            }

            book_view_models = state_manager.CurrentCollection
                               .Books
                               .Select(b => new BookViewModel(b))
                               .ToList();

            Books        = CollectionViewSource.GetDefaultView(book_view_models);
            Books.Filter = Filter;

            current_book_disposable = Books.Events()
                                      .WhenAnyObservable(x => x.CurrentChanged)
                                      .Select(_ => Books.CurrentItem as BookViewModel)
                                      .Subscribe(vm => BookDetails.CurrentBook = vm?.Obj);


            // This is needed to update the book details
            Books.Refresh();
        }
        public override void OnDeactivated()
        {
            base.OnDeactivated(); // CollectionModuleBase handles deactivation of common parts
            ShelvesList.Deactivate();
            BookDetails.Deactivate();

            selected_shelves = null;
            current_book_disposable.Dispose();
            current_book_disposable = null;
            SearchField.Clear(); // This will also clear the search_results
            Books = null;
            book_view_models.DisposeAll();
            book_view_models = null;
        }