使用MVVM Light在WP Universal App上异步加载数据
本文关键字:异步 加载 数据 App Universal MVVM Light WP 使用 | 更新日期: 2023-09-27 18:06:42
我正在使用MVVM Light开发Windows Phone通用应用程序(我是MVVM模式的新手)。我的问题是让它像这样工作:
- 应用程序启动(或用户导航到不同的视图), 然后我们看到基本的UI,
- ,然后我们等待数据被加载,而应用程序保持响应。
- 实施
NotifyTaskCompletion<T>
- 实现异步命令
- 从视图模型构造函数中调用异步void
- 在"page loaded"事件调用的命令中加载数据
和的情况下,我的应用程序显示启动屏幕(或在导航到另一个页面之前阻塞),除非数据被加载。方法正确返回数据,视图显示数据。
所以我的问题是,什么是正确的方式来加载数据异步在通用应用程序?我将非常感激你的帮助。
我的代码现在看起来是这样的:
<我> MainViewModel.cs 我>
public MainViewModel()
{
this._navigationService = ServiceLocator.Current.GetInstance<INavigationService>();
_newsService = ServiceLocator.Current.GetInstance<INewsService>();
LoadMainPageCommand =
new RelayCommand(async() => await LoadMainPageData());
}
public RelayCommand LoadMainPageCommand { get; set; }
private async Task LoadMainPageData()
{
// to make it work a bit longer
for (int i = Int32.MaxValue; i > 20000; i--) ;
NewsCategories= await _newsService.GetNewsCategoriesAsync();
RaisePropertyChanged("NewsCategories");
}
<我> HubPage.xaml 我>
<Page
x:Class="xxx.HubPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:xxx"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:i="using:Microsoft.Xaml.Interactivity"
xmlns:core="using:Microsoft.Xaml.Interactions.Core"
xmlns:data="using:xxx.Data"
mc:Ignorable="d">
<i:Interaction.Behaviors>
<core:EventTriggerBehavior EventName="Loaded">
<core:InvokeCommandAction Command="{Binding LoadMainPageCommand}"/>
</core:EventTriggerBehavior>
</i:Interaction.Behaviors>
...
<我> INewsService.cs 我>
public interface INewsService
{
Task<ObservableCollection<NewsCategory>> GetNewsCategoriesAsync();
}
你的问题在你的"测试"代码:
private async Task LoadMainPageData()
{
// to make it work a bit longer
for (int i = Int32.MaxValue; i > 20000; i--) ;
NewsCategories= await _newsService.GetNewsCategoriesAsync();
RaisePropertyChanged("NewsCategories");
}
这是一个异步签名的方法,它正在执行同步工作。如果您想要保持延迟,那么可以异步执行:
private async Task LoadMainPageData()
{
// to make it work a bit longer
await Task.Delay(TimeSpan.FromSeconds(3));
NewsCategories= await _newsService.GetNewsCategoriesAsync();
RaisePropertyChanged("NewsCategories");
}