MVVM视图模型异步数据初始化
本文关键字:数据 初始化 异步 模型 视图 MVVM | 更新日期: 2023-09-27 17:57:32
我正在努力熟悉Windows应用商店应用程序和MVVM模式(我是这个平台的新手)。我有一个非常简单的应用程序,它从json文件中解析Person对象列表,然后在gridView中显示它们。我创建了一个PeopleViewModel类作为主页面的视图模型,它处理解析,并公开视图的对象数组。解析方法:
public async Task init()
{
StorageFolder resourceFolder = Windows.ApplicationModel.Package.Current.InstalledLocation;
resourceFolder = await resourceFolder.GetFolderAsync("Resources");
StorageFile resourceFile = await resourceFolder.GetFileAsync("persons.json");
string fileContent = await Windows.Storage.FileIO.ReadTextAsync(resourceFile);
ObservableCollection<Person> persons = new ObservableCollection<Person>();
JsonValue json = JsonValue.Parse(fileContent);
int personCount = json.GetArray().Count;
for (int i = 0; i < personCount; i++)
{
IJsonValue element = json.GetArray()[i];
Person p = new Person(element);
persons.Add(p);
}
_persons = persons;
}
然后在XAML中,我将此类设置为页面的数据上下文:
<!-- viewModel namespace defined above -->
<Page.DataContext>
<viewModel:PeopleViewModel/>
</Page.DataContext>
由于读取文件是一个异步操作,我不能将它放在PeopleViewModel的默认构造函数中,我必须从我的xaml:的代码隐藏文件中调用它的init()方法
private async void navigationHelper_LoadState(object sender, LoadStateEventArgs e)
{
PeopleViewModel viewModel = this.DataContext as PeopleViewModel;
await viewModel.init();
}
我的代码运行良好,但我想知道这是否是正确的方法。有没有一种方法可以用异步方法初始化我的视图模型,并保持我的代码隐藏文件"干净"(或者这个解决方案被认为是干净的)?
当然有,只需从构造函数中调用一个async void
方法(不需要await
),它现在可以反过来调用具有await
的方法。(是的,最好的做法是保持代码背后的清洁。)
编辑:
因此,根据你的经验,我省略了说你真的不应该这样做的部分。相反,设置一些事件通知视图模型加载内容的内容。基本上,您应该只将async void
与事件处理程序一起使用。更多信息,请点击本页底部:http://caraulean.com/blog/2013/07/15/using-caliburn-micro-with-async-await/(虽然我更喜欢MVVMlight或PRISM,但后者甚至为您提供了INavigationAware
接口,您也可以在VM中获得OnNavigatedTo
事件。)