public SearchResultLivePageViewModel(
            ILoggerFactory loggerFactory,
            ApplicationLayoutManager applicationLayoutManager,
            NiconicoSession niconicoSession,
            SearchProvider searchProvider,
            PageManager pageManager,
            SearchHistoryRepository searchHistoryRepository,
            NicoLiveCacheRepository nicoLiveCacheRepository,
            OpenLiveContentCommand openLiveContentCommand
            )
            : base(loggerFactory.CreateLogger <SearchResultLivePageViewModel>())
        {
            ApplicationLayoutManager = applicationLayoutManager;
            NiconicoSession          = niconicoSession;
            SearchProvider           = searchProvider;
            PageManager = pageManager;
            _searchHistoryRepository = searchHistoryRepository;
            _nicoLiveCacheRepository = nicoLiveCacheRepository;
            OpenLiveContentCommand   = openLiveContentCommand;

            SelectedSearchSort = new ReactiveProperty <LiveSearchPageSortOrder>(SortOptionItems[0], mode: ReactivePropertyMode.DistinctUntilChanged);
            SelectedLiveStatus = new ReactiveProperty <LiveStatus>(LiveStatusItems[0], mode: ReactivePropertyMode.DistinctUntilChanged);
            SelectedProviders  = new ObservableCollection <ProviderType>();

            IsTagSearch          = new ReactiveProperty <bool>(false);
            IsTimeshiftAvairable = new ReactiveProperty <bool>(false);
            IsHideMemberOnly     = new ReactiveProperty <bool>(false);
            IsDisableGrouping    = new ReactiveProperty <bool>(false);

            Observable.Merge(
                SelectedSearchSort.ToUnit(),
                SelectedLiveStatus.ToUnit(),
                SelectedProviders.CollectionChangedAsObservable().ToUnit()
                )
            .Subscribe(async _ =>
            {
                if (_NowNavigatingTo)
                {
                    return;
                }

                if (_query is not null)
                {
                    if (_query.Keyword == Keyword &&
                        _query.SortOrder == SelectedSearchSort.Value &&
                        _query.LiveStatus == SelectedLiveStatus.Value &&
                        (_query.ProviderTypes?.Any() ?? false) &&
                        SelectedProviders.Count == _query.ProviderTypes.Length &&
                        SelectedProviders.All(x => _query.ProviderTypes.Contains(x))
                        )
                    {
                        return;
                    }
                }

                ResetList();
            })
            .AddTo(_CompositeDisposable);
        }
 public LiveSearchSource(
     LiveSearchOptionsQuery query,
     TimeshiftReservationsDetailResponse reservation,
     SearchProvider searchProvider,
     NiconicoSession niconicoSession,
     NicoLiveCacheRepository nicoLiveCacheRepository
     )
 {
     Query                    = query;
     _reservation             = reservation;
     SearchProvider           = searchProvider;
     NiconicoSession          = niconicoSession;
     _nicoLiveCacheRepository = nicoLiveCacheRepository;
 }