如何在 XAML 页构造函数中初始化基于文件的数据模型

本文关键字:于文件 文件 数据模型 初始化 XAML 构造函数 | 更新日期: 2023-09-27 18:35:51

鉴于您只能在标记为异步的方法中使用 await 关键字,从构造函数初始化基于文件的数据模型的方法是什么? 仍然计划在OnNavigatedTo()方法中设置DataContext。

以前,我会简单地说

MyDataModel d = new MyDataModel();

MyDataModel 的构造函数将执行文件 I/O。

到目前为止,我所能弄清楚的只是我可以在构造函数中使用 DispatchTimer 来触发标记为异步的事件处理程序并从那里执行文件 I/O。

如何在 XAML 页构造函数中初始化基于文件的数据模型

您可以在 Navigate 方法中将 DataModel 作为参数传递,然后将其从 e.Parameter 转换回 OnNavigatedTo(NavigationEventArgs e) 中。

-或-

你可以尝试一个IOC容器,我已经使用过Ninject,但不确定它是否适用于Metro应用程序。 MVVM Light也有一个简单的IOC连接器。

如果我

正确理解你的问题(基于你对迈克尔答案的评论)。您很难在构造函数中await异步操作。构造函数不能是异步的,因此你不能在那里等待任何 asyn 方法。但是,有一个简单的解决方法;您可以重构构造函数中的所有异步操作,并将它们添加到异步方法中,但无需等待它。在下面的示例中,您可以从构造函数调用LoadFileAsync

class MyDataModel
{
  public MyDataModel()
  {
      LoadFileAsync(); 
  }
  public async void LoadFileAsync()
  {
     // do async operations here 
     var file = await FooAsync(); 
  }
}

这样做最终将允许您从页面的构造函数或onNavigateTo设置数据模型

我发现的底线是,在对象构造函数中基本上不可能以"明显的同步"行为执行文件 I/O。

因此,在我的 Win8 应用程序中,我可以选择在导航到第一页之前实例化数据模型(如果这涉及文件 I/O,这不是一个好主意),或者只是忍受"松散的鹅"视觉体验,以便出现我的第一页,然后在加载数据并使用实际数据模型更新 DataContext 之后, 数据准备就绪后会"飞入"。

鉴于应用程序应该在 5 秒内启动<(如果可能的话,远少于此),我选择了"松散的鹅"方法。