2011-06-15 52 views
2

所有,的ObservableCollection VS普通名單異步Web服務調用

我只是執行,需要採取作爲參數的對象列表的Web服務方法。在客戶端,我試圖調用它傳遞一個對象列表,但編譯器抱怨說它需要一個ObservableCollection來代替。下面是代碼:

服務器端

[WebMethod] 
public void SaveMarks(List<CompletedMark> marks) 
{ 
    // TODO: IMPLEMENT SAVING THE MARKS 
} 

客戶端

private void SaveMarks() 
{ 
    ObservableCollection<CompletedMark> marks = new ObservableCollection<CompletedMark>(); 
    //List<CompletedMark> marks = new List<CompletedMark>(); 

    foreach (SelectedField elem in SelectedFields) 
    { 
     marks.Add(new CompletedMark 
         { 
          FormId = curFormId, 
          QuestionId = elem.Qid, 
          XPos = Canvas.GetLeft(elem.assocGrid), 
          YPos = Canvas.GetTop(elem.assocGrid), 
          Width = elem.assocGrid.Width, 
          Height = elem.assocGrid.Height 
         }); 
    } 
    proxy.SaveMarksAsync(marks); 
} 

我評論了,我最初指定的目錄就行了。爲什麼我需要在這裏使用ObservableCollection,即使我在服務器上聲明它爲List類型?我的服務器端聲明不正確嗎?

+0

你最近更新/重新生成代理嗎?它可能不同步 – BrokenGlass 2011-06-15 14:54:34

+0

是的,它已更新。問題在於類型被傳遞,而不是根本不工作。 – themaestro 2011-06-15 17:43:36

回答

4

在Silverlight中序列化爲默認類型的集合是ObservableCollection,主要是爲了便於將它用於DataBinding目的。 Ehsan的回答是正確的。您可以在「配置服務參考」對話框中更改默認類型。

或者,您可以將其更改爲序列化爲通用列表(如果您擁有各種使用者,或者如果這更多是數據傳輸對象而不是您要直接綁定的東西) 。

2

轉到您的客戶端項目 - >服務參考 - > [您的代理服務器],然後右鍵單擊並選擇配置服務參考。在新打開的對話框中,您可以設置您喜歡將集合序列化的方式。

+0

謝謝,但改變這一點會有什麼影響。爲什麼默認的ObservableCollection與List不同?底層機制是什麼? – themaestro 2011-06-15 15:34:48