假设您了解 ObservableCollection 以及使用 async void 的后果(请参阅下面的我的 cmets),我会推荐以下方法之一:
更简单的方法是在构造函数中调用InitializeAsync() 方法开始加载:
class MyViewModel
{
public MyViewModel()
{
InitializeAsync();
}
//warning: async void!
public async void InitializeAsync()
{
Records = await _database.LoadData();
}
}
或者你可以调整_database服务来做延迟加载(我推荐这种方法,因为它保持ViewModel干净):
class MyViewModel
{
public MyViewModel()
{
Records = _database.LoadData();
}
}
class Database
{
private ObservableCollection<Record> _data = new ObservableCollection<Record>();
public ObservableCollection<Record> LoadData()
{
EnsureLoaded();
return _data;
}
private bool _isLoaded = false;
private async void EnsureLoaded()
{
lock (this)
{
if (_isLoaded)
return;
_isLoaded = true;
}
//do the actual loading here
var myResultList = await DoLoadingAsync();
foreach (myResultList as item)
{
_data.Add(item);
}
}
}
关于async void的说明:
您可以使用 void(而不是 Task)作为异步方法的返回类型。这将导致“即发即弃”操作:
public void DoStuff()
{
FireAndForgetAsync();
}
private async void FireAndForgetAsync()
{
await Task.Delay(1000);
throw new Exception(); //will be swallowed
}
当您返回 void 时,您不能等待 FireAndForgetAsync。您将无法知道该方法何时结束,并且在 async void 方法中引发的任何异常都将被吞没。
关于ObservableCollection的说明:
这种类型的List 在您添加/删除/替换项目后引发事件。您可以使用此事件来填充您的视图,而无需在每次更改时重新加载整个列表。
如果你正确地实现了这一点,你可以在完成加载后立即向用户显示每个项目,而不是让他等到所有内容都完全加载。