このシナリオはどのように処理したのですか。これに類似した動作が必要になります。この動作は、特定の既知の値が設定されている場合にのみコマンドを呼び出します。あなたのコンストラクタの最後で
// Only invoke the command when the property matches a known value that can't happen through normal execution
this.WhenAnyValue(vm => vm.SomeProperty)
.Where(sp => sp == null)
.Throttle(TimeSpan.FromSeconds(.25), TaskPoolScheduler.Default)
.Do(_ => Debug.WriteLine($"Refresh the List"))
.InvokeCommand(GetList)
.DisposeWith(SubscriptionDisposables);
は、設定SomePropertyはこの場合、既知の値
this.SomeProperty = null; // or some value that makes sense
に一致するように、あなたはOnAppearingで手動でコマンドを起動する必要はありません - それが起こるとき、あなたのViewModel最初に構築され、ViewModelが廃棄されて再作成されるまで、再度実行されません。 それは私にはちょっとハック感があるようです。だから、より賢い、より多くの熟練したRxUIのウィザードがチャイムすることを望んでいますが、それは仕事を完了させます。あなたが代わりにOnAppearingコールを残すことを希望する場合
、あなたはまた、潜在的にあなたのReactiveCommandのcanExecuteプロパティを設定し、(両方のコマンドは、そうでない場合と同じ挙動するにもかかわらず)お使いのPullToRefreshアクションのために完全に異なるReactiveCommandを使用してこれを扱うことができます。このシナリオでは、最初にリストが移入された後にcanExecuteを常にfalseにしたいので、ユーザーがページに戻っても初期集計がトリガーされません。
var isInitialized = this.WhenAnyValue(vm => vm.IsInit).Select(_ => _ == false).DistinctUntilChanged();
InitList = ReactiveCommand.CreateFromTask(_ =>
{
// get list
}, isInitialized);
RefreshList = ReactiveCommand.CreateFromTask(_ =>
{
// essentially the same as InitList, but with different/no canExecute parameters
});
InitList.ObserveOn(RxApp.MainThreadScheduler).Subscribe(result =>
{
this.IsInit = false
}).DisposeWith(SubscriptionDisposables);
ここでの欠点は明らかに、である、あなたは、いくつかのロジックがドーロスヒントを使用して
出典
2017-08-18 14:35:34
Joe
あなたは 'FromEventPattern(... Appearing ...)を試しましたか?Take(1)'? – Dorus
また、ボタンのクリックを聞くようにするには、その観測可能物と 'Merge'するだけです。 – Dorus
はい@Dorus、それは動作しませんでした。しかしそれは良いアイデアでした。 – fferegrino