public ChildrenService(FilterMode filterMode, ItemFilter itemFilter, SortParameterData sortParameters)
            : base(item => item.Id)
        {
            var sort = sortParameters.WhenValueChanged(t => t.SelectedItem)
                       .Select(prop => prop.Comparer);

            var modeFilter = itemFilter.WhenValueChanged(t => t.TreeMode)
                             .Select(ModeFilter);

            var searchFilter = itemFilter.WhenValueChanged(t => t.SearchText)
                               .Select(SearchFilter);

            var childNodes = this.Connect()
                             .TransformToTree(item => item.ParentId)
                             .Transform(item =>
            {
                item.Item.InitializeChildNodes(item);
                return(item.Item);
            })
                             .DisposeMany()
                             .Filter(modeFilter)
                             .Filter(searchFilter)
                             .Sort(sort)
                             .Bind(this.childNodes)
                             .Subscribe();

            this.CleanUpTarget.Add(childNodes);
        }
        public PagedDataViewer(ITradeService tradeService, SearchHints searchHints)
        {
            SearchHints = searchHints;

            SortParameters = new SortParameterData(
                tradeService.Live
                .Selecting(t => new TradeProxy(t))
                .CollectionDisposing(),
                _consumer);

            AllData =
                new Computing <ObservableCollection <TradeProxy> >(
                    () => SortParameters.SelectedItem.SortedData)
                .Filtering(t =>
                           t.Trade.CurrencyPair.Contains(SearchHints.SearchTextThrottled.Value, StringComparison.OrdinalIgnoreCase) ||
                           t.Trade.Customer.Contains(SearchHints.SearchTextThrottled.Value, StringComparison.OrdinalIgnoreCase));

            Data = AllData.Paging(25, 1).For(_consumer);

            _nextPageCommand     = new Command(() => Data.CurrentPage = Data.CurrentPage + 1, () => Data.CurrentPage < Data.PageCount);
            _previousPageCommand = new Command(() => Data.CurrentPage = Data.CurrentPage - 1, () => Data.CurrentPage > 1);
        }