MVVM viewmodel异步数据初始化

时间:2014-04-08 09:02:09

标签: c# .net mvvm windows-store-apps

我正在尝试熟悉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();
}

我的代码运行良好,但我想知道这是否是正确的方法。有没有办法用异步方法初始化我的viewmodel,并保留我的代码隐藏文件&#34; clean&#34; (或者这个解决方案被认为是干净的吗?)

1 个答案:

答案 0 :(得分:2)

当然有,只需从构造函数调用async void方法(不需要await),现在可以调用await方法。 (是的,最好的做法是保持代码隐藏。)

编辑:

因此,根据您的经验,我遗漏了部分内容,说您不应该这样做。而是设置事件通知您的viewmodel加载东西的东西。基本上,您只应将async void与事件处理程序一起使用。有关详细信息,请参阅本页底部:http://caraulean.com/blog/2013/07/15/using-caliburn-micro-with-async-await/(虽然我更喜欢MVVMlight或PRISM - 后者甚至会为您提供INavigationAware界面,您可以在其中获取VM中的OnNavigatedTo个事件。)