我有一个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。)
答案 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..
}
}