在视图模型的构造函数中,在MVVM Light中异步加载Blendable样本数据

时间:2015-06-09 10:54:02

标签: mvvm-light

我有一个Windows Phone 8.1 MVVM Light项目,并且我正在努力保持它的Blendable

在我看来,我有几个选择。我可以加载不同的视图模型,具体取决于ViewModelBase.IsInDesignModeStatic构造函数中ViewModelLocator是否为真,或者我可以在视图模型构造函数中测试ViewModelBase.IsInDesignModeStatic并正确加载数据。

如果ViewModelBase.IsInDesignModeStatic为真,我需要从文件加载数据。这是我的代码:

public async Task<ThingsSampleDataSource> GetSampleDataAsync()
{
    if (_DeserializedThingsSampleDataSource == null)
    {
        var dataUri = new Uri(_SampleDataJSONFile);
        var file = await StorageFile.GetFileFromApplicationUriAsync(dataUri);
        var jsonText = await FileIO.ReadTextAsync(file);
        _DeserializedThingsSampleDataSource = JsonConvert.DeserializeObject<ThingsSampleDataSource>(jsonText);
    }
    return _DeserializedThingsSampleDataSource;
}

当我调用该方法时,我需要标记调用await,从而标记调用方法async。但构造函数不能标记为async

或者我可以提供ContinueWith延续而不是等待异步代码的返回。但Blend会在ContinueWith完成之前加载页面。

鉴于样本数据是在视图模型或定位器服务构造函数中加载的,并且它必须从文件加载数据,一个异步活动,我该如何在MVVM Light中执行此操作,以便样本数据在Blend?

中可用

(N.B。我发现的其他答案,例如this one,不使用MVVM Light。)

1 个答案:

答案 0 :(得分:1)

使用命令将数据加载到页面加载事件,以便您可以利用 await / async 的内容。我不知道如何使用混合物,因为我不太习惯。

  

查看:

<i:Interaction.Triggers>
    <i:EventTrigger EventName="Loaded">
        <i:InvokeCommandAction Command="{Binding PageLoadedCommand}"/>
    </i:EventTrigger>   
</i:Interaction.Triggers>
  

视图模型:

public RelayCommand PageLoadedCommand { get; private set; }
public MyConstructor(IService serviceInjected)
{
    PageLoadedCommand = new RelayCommand(async()=>await OnPageLoaded());
....
}

private async Task OnPageLoaded()
{
   if(ViewModelBase.IsInDesignModeStatic)
   {
       var data = await GetSampleDataAsync();
       //Do something..
   }
}