2017-05-03 2 views
2

コマンドを実行しようとしているため、私のビューのコンストラクタ内から非同期に実行されている関数があります。私はコンストラクタで非同期的に何かを実行することは必ずしも良い習慣ではないことを理解していますが、ビューが開くときにデータグリッドをロードする必要があります.3-5秒の時間がかかるので、IsLoadingプロパティデータを取得する私のコマンドは、別のスレッドで実行されます。ここでReactiveUIでコマンドを手動で実行する場合7.2

は、上記を行うには、私のコマンド/プロパティの宣言です:

public ReactiveCommand EnterCmd { get; private set; } 
ObservableAsPropertyHelper<bool> _isLoading; 
public bool IsLoading => _isLoading.Value; 

そして、ここでは、コンストラクタの私のインスタンスです:

EnterCmd = ReactiveCommand.CreateFromTask(LoadGridData); 
EnterCmd.IsExecuting.ToProperty(this, x => x.IsLoading, out _isLoading); 

私が行って、私のstartコマンドを実行したいのですがEnterCmd.Execute()のようなものです。 私は同様の質問hereを見つけましたが、Execute()はもうReactiveCommandで有効な方法ではないようです。任意のアイデアをいただければ幸いです。 Exexute()方法は、それが今、観察を返すので、あなたはそれを動作させるためにそれに加入する必要がバージョン7で変更されました

答えて

4

Jonの答えに加えて、あなたは「あなたを確保する必要がありますReactiveCommand(実行の概念を持たない基本クラス)でなく、ReactiveCommand<TParam, TResult>にアクセスしてください。

EnterCmdのプロパティが正しいタイプ(ReactiveCommand<Unit, Unit>など)であることを確認してください。

+1

好奇心をそそらずに、「ユニット」とは何ですか?私はそれについての確かな文書を見つけることができないようです。 – jewnbug97

8

EnterCmd.Execute().Subscribe(); 
+1

を支援私のコマンドタイプでExecute()が利用できるようになりました。そのため、私はKentの答えを正しいものにしました。しかし、私はあなたに投票しましたが、それでもまだ残りの部分を手に入れることができました。ありがとう! – jewnbug97

3

これを実現する別の方法は、InvokeCommandというメソッドを使用してコマンドを呼び出すことです。

あなたは以下のリンクでそれを使用する方法の詳細情報を見つけることができます:Invoking Commands

また、一つのこともReactiveUIで推奨されては、コンストラクタ(ない良いテスト設計)でコマンドを実行することではありません。代わりに、このようなビューからコマンドを呼び出すようにしてみてください。

this.WhenActivated((disposables) => 
{ 
    this.WhenAnyValue(view => view.ViewModel.LoadData) 
       .Select(cmd => Unit.Default) 
       .InvokeCommand(this.ViewModel.LoadData); 
}); 

あなたはこのトピックに関する詳細な情報を見つけることができますhere

を希望これは私が私のコマンドの最後に を追加するために必要な

+0

これを試してみます。ヒントをありがとう! – jewnbug97

関連する問題