2011-08-09 35 views
1

我希望能夠在Silverlight中將數據加載到DataGrid中,因爲它變得可用。這裏是場景:Silverlight/C# - 動態加載WCF數據的最佳方式?

  1. 我的silverlight客戶端觸發一個WCF呼叫到服務器。
  2. 服務器需要大約1到2秒的時間來響應。
  3. 響應介於1 MB和4 MB之間(相當大)。
  4. 該數據被加載到DataGrid中。
  5. 儘管服務器的響應速度很快,但用戶不會看到數據,直到下載完所有1 MB到4 MB的數據爲止。

在客戶端下載數據時,將數據加載到DataGrid中的最佳(或最有效)方式是什麼?而不是等待下載完成?

+0

服務返回的數據格式是什麼? –

+0

這是一個基本的HttpBinding,使用SOAP。 – twitchax

回答

3

處理此問題的一種方法是實施自定義虛擬化。

  • 添加僅返回IDS
  • 添加,通過ID返回單個對象

檢索IDS,僅裝入可見的對象(和更多的也許只有幾web服務方法的Web服務方法允許滾動) 需要滾動時檢索更多對象。

+0

這可以工作。但是,我實際上希望所有數據都可以加載,而不管滾動。我只是希望數據在下載開始後立即向用戶顯示。 – twitchax

+0

@twitchax,您無法顯示尚未檢索的數據。每次獲取對象時,都將其添加到我們綁定到網格的集合/ ViewModel中。這樣他們將在加載時立即顯示。無論滾動如何,您都可以繼續下載。 –

1

這個問題是我試圖得到我的評論(你還沒有真正指定返回的數據類型)的一部分,以及埃爾諾給你一個可行的解決方案。 Web服務序列化您要發送的任何返回類型,並且不會給出部分結果。這不是您如何與網格進行交互的問題,而是客戶端上的Web服務調用何時說「我收到您需要的數據,現在繼續處理」的問題。舉例來說,如果你在使用4MB值得記錄的服務器端收集了數據表,然後在你的服務做:

return MyMassiveDatatable; 

然後,你將不得不等待整個數據表是序列化並通過電線泵送。

他的解決方案是打破原子單位的轉移。 I.E.首先在一個web服務調用中查詢記錄的id,然後遍歷這些id並一次一個請求記錄每個id,並且當您收到一條記錄時,將其添加到您的客戶端表中,以便您的顯示器會在您獲取每條記錄時進行寫入。