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

我的代码运行良好,但我想知道这是否是正确的方法。有没有一种方法可以用异步方法初始化我的视图模型,并保持我的代码隐藏文件"干净"(或者这个解决方案被认为是干净的)?

MVVM视图模型异步数据初始化

当然有,只需从构造函数中调用一个async void方法(不需要await),它现在可以反过来调用具有await的方法。(是的,最好的做法是保持代码背后的清洁。)

编辑:

因此,根据你的经验,我省略了说你真的不应该这样做的部分。相反,设置一些事件通知视图模型加载内容的内容。基本上,您应该只将async void与事件处理程序一起使用。更多信息,请点击本页底部:http://caraulean.com/blog/2013/07/15/using-caliburn-micro-with-async-await/(虽然我更喜欢MVVMlight或PRISM,但后者甚至为您提供了INavigationAware接口,您也可以在VM中获得OnNavigatedTo事件。)