public bool Satisfies(string filterValue, IncrementalFilteringMode filteringMode)
        {
            switch (filteringMode)
            {
            case IncrementalFilteringMode.StartsWith:
                return(FilterKey.StartsWith(filterValue));

            case IncrementalFilteringMode.Contains:
                return(FilterKey.Contains(filterValue));

            default:
                return(true);
            }
        }
        private void Filter(string actualFilterValue, IncrementalFilteringMode filteringMode)
        {
            CurrentFilter = actualFilterValue;

            var baseDataFiltered = BaseData.Value;

            if (actualFilterValue.IsNotEmpty())
            {
                var filterValue = actualFilterValue.ToLower();

                baseDataFiltered = baseDataFiltered.Where(x => x.Satisfies(filterValue, filteringMode)).ToList();
            }

            ActualData = baseDataFiltered;
        }
        public void ApplyFilter(string actualFilterValue, IncrementalFilteringMode filteringMode, int beginIndex, int endIndex)
        {
            Filter(actualFilterValue, filteringMode);
            Sort();
            TruncateToBorders(beginIndex, endIndex);

            if (beginIndex == 0 && ActualData.IsEmpty())
            {
                var correctFilterValue = FindCorrectFilter(NextFilterValue(actualFilterValue), filteringMode);

                Filter(correctFilterValue, filteringMode);
                Sort();
                TruncateToBorders(0, endIndex - beginIndex);
            }

            ActualDataSource = ActualData.ToSource().ToList();
        }
        private string FindCorrectFilter(string possibleFilterValue, IncrementalFilteringMode filteringMode)
        {
            if (possibleFilterValue.IsEmpty())
            {
                return(null);
            }


            var filterValue = possibleFilterValue.ToLower();

            if (BaseData.Value.Any(x => x.Satisfies(filterValue, filteringMode)))
            {
                return(possibleFilterValue);
            }


            return(FindCorrectFilter(NextFilterValue(possibleFilterValue), filteringMode));
        }