使用MVVM Light在WP Universal App上异步加载数据

时间:2015-08-05 15:14:09

标签: c# mvvm windows-phone-8.1 mvvm-light win-universal-app

我正在使用MVVM Light开发一个Windows Phone通用应用程序(我是MVVM模式的新手)。我的问题是让它像那样工作:

  1. 启动应用程序(或用户导航到不同的视图),
  2. 然后我们看到了基本的用户界面,
  3. 然后我们等待加载数据,同时应用程序保持响应。

到目前为止,我已经测试过许多不同的方法,如:

并且在每种情况下我的应用程序显示启动画面(或在导航到另一个页面之前被阻止),除非数据已加载。方法正确返回数据,视图显示良好。

所以我的问题是,在Universal App中异步加载数据的正确方法是什么?我将非常感谢你的帮助。

这就是我的代码现在的样子:

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();
}

1 个答案:

答案 0 :(得分:0)

您的问题出在“测试”代码中:

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");
}

然后任何方法都应该有用。