[英]How can I preload data in UWP before page is loaded? Using MVVM and Windows Template Studio
這樣做的最佳做法是什么? 請記住,我使用的是 MVVM 模式和 Windows 模板工作室。 因此,如果有一些內置的數據加載解決方案/最佳實踐,我會很高興知道這一點。
我正在從 API 到 http 異步加載數據,這需要幾秒鍾。 所以當用戶點擊頁面時,他必須在數據出現之前稍等片刻。 我希望在用戶單擊頁面之前預加載數據。 應用程序啟動時應加載頁面數據。
這是我現在將數據加載到頁面中的代碼:
XAML
<i:Interaction.Behaviors>
<ic:EventTriggerBehavior EventName="Loaded">
<ic:InvokeCommandAction Command="{x:Bind ViewModel.LoadedCommand}" />
</ic:EventTriggerBehavior>
</i:Interaction.Behaviors>
視圖模型:
public ICommand LoadedCommand => loadedCommand ?? (loadedCommand = new RelayCommand(LoadData));
private async void LoadData()
{
await LoadItemsAsync();
await LoadImagesAsync();
}
private async Task LoadItemsAsync()
{
var items = await itemsDataAccess.GetAllAsync();
foreach (Item i in items)
ItemImageLinks.Add(new ItemImageLink() { Item = i });
}
private async Task LoadImagesAsync()
{
if (!InternetConnectionService.IsConnected())
return;
foreach (ItemImageLink iml in ItemImageLinks)
iml.Image = await imagesDataAccess.GetImageAsync(iml.Item.ImageStringName);
}
字段聲明:
private Lazy<Task<ItemImageLink[]>> ItemImageLinks;
在構造函數中初始化:
ItemImageLinks = new Lazy<Task<ItemImageLink[]>>(() => Task.Run(async () =>
{
return await itemsDataAccess.GetAllAsync()
.Select(item => new ItemImageLink() { Item = item })
.ToArray();
}));
在PreLoad
方法中預加載:
await ItemImageLinks.Value;
需要在任何地方使用:
foreach (ItemImageLink item in await ItemImageLinks.Value)
{
// Do something with the item
}
更新:僅當您必須在某個任意時間點進行預加載時才需要Lazy
包裝器。 如果您總是在構造函數中立即預加載,那么一個簡單的Task<ItemImageLink[]>
就足夠了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.