Xamarin.forms 带ReactiveUI的可分页实时搜索

Xamarin.forms 带ReactiveUI的可分页实时搜索,xamarin.forms,reactiveui,Xamarin.forms,Reactiveui,我有一个界面,当我需要我的视图可分页时,我会将它添加到我的ViewModel中 public interface IPageable { Task LoadNextPage(); bool IsLoadingPage { get; set; } } 然后,我将一个PageableBehavior附加到我的ListView,每当我的ListView到达页面底部时,它就会调用IPageable.LoadNextPage()在ViewModel上。(注意:在不使用ReactiveUI

我有一个界面,当我需要我的视图可分页时,我会将它添加到我的ViewModel中

public interface IPageable
{
    Task LoadNextPage();
    bool IsLoadingPage { get; set; }
}
然后,我将一个
PageableBehavior
附加到我的
ListView
,每当我的ListView到达页面底部时,它就会调用
IPageable.LoadNextPage()在ViewModel上。(注意:在不使用ReactiveUI的情况下,所有这些都可以正常工作)

我的问题是,尽管我可以很容易地对搜索词做出反应,但我似乎不知道如何以反应的方式将下一页加载到
\u搜索结果中

public class SeedSelectionViewModel : ReactiveObject, IPageable
{
    private const int PageSize = 30;
    private const int Threshold = 3;
    private static readonly TimeSpan _throttle = TimeSpan.FromMilliseconds(200);
    private readonly ISeedInputDataService _dataService;
    private readonly ObservableAsPropertyHelper<IEnumerable<SeedVarietySeed>> _searchResults;

    public SeedSelectionViewModel(ISeedInputDataService dataService)
    {
        _dataService = dataService;

        this.WhenAnyValue(x => x.SearchText)
            .Throttle(_throttle)
            .Select(term => term?.Trim())
            .DistinctUntilChanged()
            .Where(term => !string.IsNullOrWhiteSpace(term) && term.Trim().Length >= Threshold)
            .SelectMany((searchText,count,token) => SearchSeedVarieties(searchText,0))
            .ObserveOn(RxApp.MainThreadScheduler)
            .ToProperty(this, nameof(SearchResults), out _searchResults);
    }

    [Reactive] public string SearchText { get; set; }

    [Reactive] public bool IsLoadingPage { get; set; }

    public IEnumerable<SeedVarietySeed> SearchResults => _searchResults.Value;

    private Task<IEnumerable<SeedVarietySeed>> SearchSeedVarieties(string searchText, int skip) 
        => _dataService.FindSeedVarieties(searchText, skip, PageSize, CancellationToken.None);

    public Task LoadNextPage()
    {
        // how do I load additional results into _searchResults?
        return Task.CompletedTask;
    }
}
public类SeedSelectionViewModel:ReactiveObject,IPageable
{
private const int PageSize=30;
私有常量int阈值=3;
私有静态只读时间跨度_throttle=TimeSpan.fromMillics(200);
私有只读ISeedInputDataService\u dataService;
私有只读ObservablesPropertyHelper\u搜索结果;
公共种子SelectionViewModel(ISeedInputDataService数据服务)
{
_数据服务=数据服务;
此.whenyValue(x=>x.SearchText)
.节气门(_节气门)
.Select(term=>term?.Trim())
.DistinctUntilChanged()
.Where(term=>!string.IsNullOrWhiteSpace(term)&&term.Trim().Length>=阈值)
.SelectMany((searchText,count,token)=>searchSeedVaries(searchText,0))
.ObserveOn(RxApp.MainThreadScheduler)
.ToProperty(此,名称(搜索结果),out\u搜索结果);
}
[Reactive]公共字符串搜索文本{get;set;}
[Reactive]公共bool IsLoadingPage{get;set;}
public IEnumerable SearchResults=>\u SearchResults.Value;
私有任务searchSeedVaries(字符串searchText,int skip)
=>\u dataService.findSeedVaries(searchText、skip、PageSize、CancellationToken.None);
公共任务加载下一页()
{
//如何将其他结果加载到_searchResults中?
返回Task.CompletedTask;
}
}

这里的问题是,您无法以这种方式使用
ObservablePropertyHelper
。您不能从两个不同的订阅中更改它

正确的处理方法是使用
observateCollection
或类似方法,并在任何值

ctor()
{
    _loadDataCommand = ReactiveCommand.CreateFromTask<string>(LoadData);

    this.WhenAnyValue(x => x.SearchText)
            .Throttle(_throttle)
            .Select(term => term?.Trim())
            .DistinctUntilChanged()
            .Where(term => !string.IsNullOrWhiteSpace(term) && term.Trim().Length >= Threshold)
            .ObserveOn(RxApp.MainThreadScheduler)
            .InvokeCommand(_loadDataCommand);
}

private async Task LoadData(string searchText)
{
    var result = await _dataService.FindSeedVarieties(searchText, 0, PageSize, CancellationToken.None).ConfigureAwait(true);
    SearchResults.ReplaceRange(result);
}
ctor()
{
_loadDataCommand=ReactiveCommand.CreateFromTask(LoadData);
此.whenyValue(x=>x.SearchText)
.节气门(_节气门)
.Select(term=>term?.Trim())
.DistinctUntilChanged()
.Where(term=>!string.IsNullOrWhiteSpace(term)&&term.Trim().Length>=阈值)
.ObserveOn(RxApp.MainThreadScheduler)
.InvokeCommand(_loadDataCommand);
}
专用异步任务LoadData(字符串搜索文本)
{
var result=await\u dataService.findSeedVaries(searchText,0,PageSize,CancellationToken.None);
SearchResults.ReplaceRange(结果);
}

感谢您的分享。请别忘了接受你的答案。我得等几天