2017-01-13 3 views
0

私はXamarin.FormsとReactiveUIで作られたアプリケーションを持っています。 Pictureこのアプリでは、一種のドロップダウン(実際には、ユーザーが1つのオプションをフィルタリングして選択できる別のビューを押すボタン)があり、この「ドロップダウン」が変更されたときに、値。ReactiveCommand.CreateFromTask最初の実行を遅らせる方法

この「ドロップダウン」は何らかの値で開始せず、非同期要求を行い、値を取得してビューを更新する必要があります。私は文書をロードするためのコマンドを作成していたときに

問題は、次のとおりです。

LoadAllDocuments = ReactiveCommand.CreateFromTask<string, IEnumerable<Document>>(_ => m_service.GetAllDocumentsByTodoListAsync(SelectedTodoList.Id), canLoadAll, m_scheduler); 

私はSelectedToDoListからIDを必要とするが、これは、この時点ではnullになります。

コマンドのこの最初の実行を遅延させる方法はありますか?あるいはこれを解決するためのより良いワークフローがありますか?

ここで私は今どのようにそれをやっているのですか?さらに情報が必要な場合は教えてください。

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); 

答えて

3

私が正しくあなたの質問を理解していれば、あなたはIdを確保する必要があるがInvokeCommandを呼び出す前にnullではありません。

SelectedTodoListChanged 
    .Where(x => x?.Id != null) 
    .InvokeCommand(LoadAllDocuments) 
    .DisposeWith(disposables); 

おそらくより良いオプションは、コマンド自体にこの知識を焼くことです。あなたのコマンドのCanExecuteが現在falseであればInvokeCommand点(あるRxUI 7のように、)コマンドの実行ウィンドウので、その後、InvokeCommandが実際にあなたのコマンドを起動しません。

var canLoadAllDocuments = this 
    .WhenAnyValue(x => x.SelectedTodoList?.Id) 
    .Select(id => id != null); 
LoadAllDocuments = ReactiveCommand.CreateFromTask<string, IEnumerable<Document>>(
    _ => m_service.GetAllDocumentsByTodoListAsync(SelectedTodoList.Id), canLoadAll, 
    canLoadAllDocuments, 
    m_scheduler); 

は今、あなたはこれを行うことができます。

SelectedTodoListChanged 
    .InvokeCommand(LoadAllDocuments) 
    .DisposeWith(disposables); 
+0

私はCreateFromTaskを実行したときにコマンドがすぐに呼び出されると誤解しましたが、私はそれを望んでいませんでした。しかし、本当に起こったことは、コマンドがあなたがそれらを呼び出すユニットを実行しないので、私はそれを呼び出す別の場所を持っていたということでした。あなたの答えはこの問題を見つけるのを助け、canLoadAllDocumentsでコードを改善しました。 – Giusepe

関連する問題