2010-07-06 96 views
2

我刚刚通过在Channel9上发布的实验室学习了Silverlight。当我尝试探索一下时,我发现我的查询不像我认为的那样工作。Silverlight不会从我的WCF RIA服务中获取数据

要重新创建我已经完成的工作,需要创建一个新的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包含一个价值,我只看到我所期望的查询,通过线路去我所有的代码已被执行之后。

我觉得我错过了一些基本的东西,如果我能找到某人向我解释它,这将会更有意义。

感谢, 埃里克

回答

2

问题是你如何加载数据有关。实际的加载操作是异步的,因为所有的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以使其正常工作。

+0

你在说什么是有道理的,我需要把它当作一个AJAX调用。当我今晚回家时,我会尝试。 – 2010-07-06 18:24:24