c# - MVVM View 模型异步数据初始化

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

我正在尝试熟悉 Windows 应用商店应用程序和 MVVM 模式(我是这个平台的新手)。我有一个非常简单的应用程序,它从 json 文件中解析 Person 对象列表,然后在 gridView 中显示它们。我创建了一个 PeopleViewModel 类作为我的主页的 View 模型,它处理解析并公开 View 的对象数组。解析方法:

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

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

最佳答案

当然有,只需调用 async void构造函数中的方法(不需要 await),现在可以使用 await 调用方法。 (是的,最佳实践是保持代码隐藏干净。)

编辑:

因此,根据您的经验,我省略了“您不应该真正这样做”的部分。相反,设置一些事件通知您的 View 模型加载内容。基本上你应该只使用 async void与事件处理程序。有关此内容的更多信息,请参见本页底部:http://caraulean.com/blog/2013/07/15/using-caliburn-micro-with-async-await/ (虽然我更喜欢 MVVMlight 或 PRISM - 后者甚至为您提供 INavigationAware 界面,您也可以在虚拟机中获取 OnNavigatedTo 事件。)

关于c# - MVVM View 模型异步数据初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22932331/

相关文章:

c# - 将 ViewModel 投影回模型的最佳方式

c# - 我的 CPU 支持多少内存?

c# - 如何从 stringformat 显示 99.99 中的 100

c# - RegisterHotkey 仅适用于 WIndows 7,不适用于 XP、server 2003

WPF 点击用户控件

c# - MVVM viewmodel使用async时如何设置datacontext

c# - 在 asp.net (C#) 的 SQL 查询中使用变量

c# - 事件的最佳执行

c# - 在按下 Enter 键时绑定(bind) TextBox

JavaScript 方法调用只能使用 ScriptManager 调用一次