我刚开始通过Channel9上发布的实验室学习Silverlight。当我尝试探索一点时,我发现我的查询没有像我想的那样工作。
要重新创建我所做的事,您需要创建一个新的Silverlight Business应用程序,创建一个指向Adventureworks LT db的数据实体,并为这些实体生成Web服务(包括编辑)。
然后我简单地将RichTextbox打包到Home.xaml和Home.xaml.cs中。我首先将此代码添加到OnNavigatedTo,当它对构造函数不起作用时。
AdventureWorksDomainContext ctx = new AdventureWorksDomainContext();
EntityQuery<Product> query =
from p in ctx.GetProductsQuery()
select p;
LoadOperation<Product> loadOp = ctx.Load(query);
var paragraph = new Paragraph();
foreach (var product in loadOp.Entities)
{
paragraph.Inlines.Add(new Run { Text = product.Name });
}
richTextBox1.Blocks.Add(paragraph);
当我运行页面时,我从未看到loadOp.Entities包含一个值,我只看到我期望的查询,在我的所有代码执行完之后穿过电汇。
我觉得我缺少一些基本的东西,如果我能找到一个人向我解释,这会更有意义。
谢谢, 埃里克
答案 0 :(得分:2)
问题与您加载数据的方式有关。实际的Load操作是异步的,所有Silverlight网络调用都是如此。您正在调用ctx.Load(query)
,然后立即将段落设置为实体。 Load
完成后,您需要使用回调。像这样的东西,
AdventureWorksDomainContext ctx = new AdventureWorksDomainContext();
EntityQuery<Product> query =
from p in ctx.GetProductsQuery()
select p;
LoadOperation<Product> loadOp = ctx.Load(query,() =>
{
var paragraph = new Paragraph();
foreach (var product in loadOp.Entities)
{
paragraph.Inlines.Add(new Run { Text = product.Name });
}
richTextBox1.Blocks.Add(paragraph);
});
由于您没有直接在绑定中使用实体并且只是迭代它们,因此您需要确保等到它们被加载。我不记得Load
方法的实际签名,因此您可能需要修改我的lambda才能使其正常工作。