2010-07-06 97 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