У меня есть приложение, созданное с помощью Xamarin.Forms и ReactiveUI. Представьте себе представление в этом приложении, где у вас есть своего рода раскрывающийся список (на самом деле кнопка, которая нажимает другое представление, где пользователь может фильтровать и выбирать один вариант), и когда этот "раскрывающийся список" изменяется, мне нужно перезагрузить список на основе его значения .
Этот «раскрывающийся список» не начинается с какого-то значения, мне нужно сделать асинхронный запрос, получить значение и затем обновить представление.
Проблема в том, что когда я создаю команду для загрузки документов:
LoadAllDocuments = ReactiveCommand.CreateFromTask<string, IEnumerable<Document>>(_ => m_service.GetAllDocumentsByTodoListAsync(SelectedTodoList.Id), canLoadAll, m_scheduler);
Мне нужен идентификатор из списка SelectedToDoList, но на данный момент он будет нулевым.
Есть ли способ отложить это первое выполнение команды? Или, может быть, есть лучший рабочий процесс для решения этой проблемы?
Вот снайпер о том, как я сейчас это делаю. Сообщите мне, если потребуется дополнительная информация.
LoadAllDocuments = ReactiveCommand.CreateFromTask<string, IEnumerable<Document>>(_ => m_service.GetAllDocumentsByTodoListAsync(SelectedTodoList.Id), canLoadAll, m_scheduler);
ChangeToDoListCommand = ReactiveCommand.CreateFromTask<DocumentListViewModel, bool>(vm => this.PushPageFromCacheAsync<ToDoListViewModel>((model) => model.ParentViewModel = this));
this.WhenActivated((CompositeDisposable disposables) =>
{
SelectedItem = null;
var SelectedTodoListChanged =
this
.WhenAnyValue(x => x.SelectedTodoList)
.Throttle(TimeSpan.FromSeconds(1), RxApp.MainThreadScheduler)
.Publish();
SelectedTodoListChanged
.Where(x => x == null)
.Subscribe(async _ => SelectedTodoList = await viewService.GetMyToDoListByVaultAsync(RuntimeContext.Current.VaultId))
.DisposeWith(disposables);
SelectedTodoListChanged
.Where(x => x != null)
.InvokeCommand(LoadAllDocuments)
.DisposeWith(disposables);
SelectedTodoListChanged.Connect();
LoadAllDocuments
.ObserveOn(m_scheduler)
.SubscribeOn(m_scheduler)
.Subscribe(list => AddViewsToList(list.ToList()))
.DisposeWith(disposables);