【问题标题】:MVVM viewmodel async data initializationMVVM 视图模型异步数据初始化
【发布时间】:2014-04-08 09:02:08
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

    编辑:

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

    【讨论】:

    • 你不应该在没有预防措施的情况下编写异步 void 方法,并且你不应该在没有明确解释副作用的情况下在属性/构造函数中进行异步调用。
    • 很公平,我会修改我的评论:)
    猜你喜欢
    • 2023-04-02
    • 1970-01-01
    • 2013-11-26
    • 1970-01-01
    • 2017-07-06
    • 2022-01-25
    • 2015-11-05
    • 2017-08-28
    • 2012-10-10
    相关资源
    最近更新 更多