Silverlight不从我的WCF RIA服务获取数据

时间:2010-07-06 12:25:08

标签: wcf silverlight ria

我刚开始通过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包含一个值,我只看到我期望的查询,在我的所有代码执行完之后穿过电汇。

我觉得我缺少一些基本的东西,如果我能找到一个人向我解释,这会更有意义。

谢谢, 埃里克

1 个答案:

答案 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才能使其正常工作。