DataGrid (XCeed DataGrid) に項目を表示する WPF アプリケーションがあります。データベース(SQLite)にたくさんのアイテムが含まれているとアプリのロードに時間がかかるので、可能であればyield returnを使ってオンデマンドでロードしたいです。XCeed DataGrid が UI 仮想化をサポートしていることは知っていますが、同期コードの次のブロックを変換する方法が完全にはわかりません。
現在、UI の速度低下を防ぐために BackgroundWorker にロードされているリストは、グリッドの 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();
}
}
または、速度を向上させて遅延読み込みを使用できる他の方法はありますか?