簡體   English   中英

如何在頁面加載之前預加載 UWP 中的數據? 使用 MVVM 和 Windows 模板工作室

[英]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);
    }

您可以結合使用LazyTask類。

字段聲明:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM