我有一个 WPF 应用程序,它显示 DataGrid (XCeed DataGrid) 中的项目。当数据库 (SQLite) 包含大量项目时,该应用程序需要一段时间才能加载,因此如果可能的话,我想使用 yield return 来按需加载这些项目。我知道XCeed DataGrid 支持 UI 虚拟化,但我不完全确定如何转换以下同步代码块。
目前,在 BackgroundWorker 中加载列表以防止 UI 变慢,填充为网格的 DataSource。
public override IList<IRecipe> GetRecipes()
{
List<IRecipe> recipes = new List<IRecipe>();
Execute(conn =>
{
using (var cmd = conn.CreateCommand()) {
cmd.CommandText = "SELECT * FROM recipes ORDER BY Name";
var reader = cmd.ExecuteReader();
while (reader.Read()) {
try {
var recipe = GetRecipe(reader);
recipes.Add(recipe);
} catch (Exception ex) {
Console.WriteLine(string.Format("Error loading recipe: {0}", ex.Message));
}
}
reader.Close();
cmd.CommandText = "SELECT * FROM Ingredients WHERE Recipe = @Recipe";
cmd.Parameters.AddWithValue("@Recipe", string.Empty);
foreach (IRecipe recipe in recipes) {
cmd.Parameters["@Recipe"].Value = recipe.ID;
reader = cmd.ExecuteReader();
while (reader.Read()) {
try {
IIngredient Ingredient = GetIngredient(reader);
recipe.Ingredients.Add(Ingredient);
} catch (Exception ex) {
Console.WriteLine(string.Format("Error adding Ingredient to recipe '{0}': {1}", recipe.Name, ex.Message));
}
}
reader.Close();
}
}
或者,还有其他方法可以提高速度并使用延迟加载吗?