public static async Task SetFromApi <TViewModel, TApiResult>( this Bindable <TViewModel> @this, Expression <Func <TViewModel, TApiResult> > viewModelProperty, string apiUrl, AsyncEvent <RevisitingEventArgs> pageRevisiting = null) { var binding = new Bindable <TViewModel> .ViewModelMemberBinding <TApiResult>(@this, viewModelProperty); var cacheAvailable = false; async Task refresh() { var fresh = await BaseApi.Get <TApiResult>(apiUrl, cacheChoice : ApiResponseCache.PreferThenUpdate, refresher : binding.Update); if (!cacheAvailable && fresh != null) { binding.Update(fresh); } } // If there is a cached result already available, set it immediately var result = await BaseApi.Get <TApiResult>(apiUrl, cacheChoice : ApiResponseCache.CacheOrNull); if (result != null) { cacheAvailable = true; await binding.Update(result); } // Otherwise send a fresh request and apply the value. refresh().RunInParallel(); // When gone back to the page, also refresh. if (pageRevisiting != null) { pageRevisiting.Handle(x => refresh()); } }