2009-12-16 88 views
2

當WCF訪問Silverlight的你,當你使用數據綁定ObservableCollection我*有*在Silverlight WCF客戶端中使用ObservableCollection嗎?

多數民衆贊成罰款生成的代理,但是當你只是調用一個方法有點笨拙。例如以下服務方法:

[OperationContract] 
    public SearchOrdersMsgOut SearchOrders(ShippingStatusType[] shippingStatuses, 
              string[] orderId) 
    { 
    } 

生成與ObservableCollection。什麼!他們只是參數。爲什麼我會想要「觀察」他們?

我很好,如果我做到這一點 - 但它似乎應該有辦法強制簡單的數組結構,當我知道我從來沒有數據綁定 - 特別是在輸入消息。

我寧願這樣做:

searchCriteria.PaymentStatus = new [] { PaymentStatusType.PaymentFailed, PaymentStatusType.Unpaid };    

比這

searchCriteria.PaymentStatus = new ObservableCollection<PaymentStatusType> { PaymentStatusType.PaymentFailed, PaymentStatusType.Unpaid }; 

有沒有辦法?

PS。我實際上使用SearchCriteria對象作爲我的搜索條件 - 但我簡化了這個例子,想知道參數處理是否不同。

+0

也許你添加一個WCF服務的Silverlight,而不是常規WCF服務? Silverlight版本可能已經將該集合類型默認設置爲ObservableCollection。 ObservableCollection和List的唯一真正區別在於默認情況下ObservableCollection會使用INotifyPropertyChanged接口。 – Tacoman667 2009-12-16 04:08:21

回答

4

您可以在整個服務範圍內執行此操作,但不是基於每個方法。在「添加服務引用」對話框中,單擊「高級」,然後爲集合類型選擇「System.Array」。但我不知道有任何方法可以按照方法進行,即將數組用於某些方法,將ObservableCollection用於其他方法。

0

確定這裏是習慣了爲我的Silverlight客戶端使用ObservableCollection之後的一個奇怪的轉折點。

我試着從我的WCF服務中返回一個Linq2XSD對象 - 然後突然低下,並看到它將所有ObservableCollection<T>屬性更改爲簡單數組[]

我認爲這是特定於Linq2XSD東西 - 所以我想只是增加一個簡單的XTypedElement物業服務定義:

public XTypedElement[] PipelineLogs { get; set; } 

這會觸發[]而不是ObservableCollection<T>生成的代理 - 在正常string[]將成爲ObservableCollection<string>

不要問我爲什麼!

我已經刪除它,因爲我其實更喜歡ObservableCollection<T>。我只是覺得這個觀察可能會讓一個有類似問題的人感興趣 - 特別是如果任何人都可以解釋爲什麼要這樣做!

+0

我從「添加服務引用」功能中看到了一些非常奇怪的行爲,包括將我所有的ObservableCollections隨機切換到數組。這顯然是一個已知的bug,我最近在某處讀到MS計劃修正它在VS2010 RC(大概是在二月底/三月初)。但它真的很煩人,我不知道MS是否打算將其修復到VS2008服務包中。 – 2010-01-19 17:17:43

+0

你這個很隨意 – 2010-01-20 04:22:32

0

當VS2010 RC有一個阻止它生成ObservableCollections的bug時,結束了OPPOSITE問題。

幸運there are two workarounds

選項1: 相信最好的選擇 - 這是更新受影響的服務引用了「Reference.svcmap」文件。在解決方案資源管理器中,選擇「顯示所有文件」並展開受影響的參考節點。在那裏你會找到「Reference.svcmap」文件,雙擊進入編輯器。對於映射的ObservableCollection,你應該看到目前是這樣的:

<CollectionMapping TypeName="System.Collections.ObjectModel.ObservableCollection`1" Category="List" /> 

更改類型名值,包括Silverlight的程序集「System.Windows」 - 象下面這樣:

<CollectionMapping TypeName="System.Collections.ObjectModel.ObservableCollection`1, System.Windows" Category="List" /> 

選項2 :生成 Reference.vb/.cs服務參考 VS之外的代理代碼文件由 直接使用SLSvcUtil.exe。 「C:\ Program Files文件 (x86)的\微軟的SDK \ Silverlight的\ 3.0 \工具\ SlSvcUtil.exe運行通過命令行 的工具在那裏將解決 的ObservableCollection問題代碼 產生問題的例子 「 /r:」C:\ Program Files(x86)\ Microsoft Silverlight \ 3.0.40818.0 \ System.Windows.dll「 /ct:System.Collections.ObjectModel.ObservableCollection`1 http:///Service1。 svc 這將默認生成一個C# 版本的服務參考 代理代碼。如果您需要生成一個 VB版本,您可以通過一個 「/ Language:VB」開關。

0

另一件事來檢查(如果你想ObservableCollection<T>但你要T[]) - 是Reference.svcmap文件

確保您已包括「System.Windows」的類型名稱。

<CollectionMapping TypeName="System.Collections.ObjectModel.ObservableCollection`1, System.Windows" Category="List" /> 

,而不是

<CollectionMapping TypeName="System.Collections.ObjectModel.ObservableCollection`1" Category="List" /> 

我猜也許它無法找到該DLL,默認爲[]