我*有*在Silverlight WCF客户端中使用ObservableCollection吗?

时间:2009-12-16 00:18:54

标签: wcf silverlight

在WCF中访问Silverlight时,您将获得使用ObservableCollection

生成的代理

当你进行数据绑定时这很好,但是当你刚刚调用一个方法时有点笨拙。例如,以下服务方法:

    [OperationContract]
    public SearchOrdersMsgOut SearchOrders(ShippingStatusType[] shippingStatuses,
                                           string[] orderId)
    {
    }
使用ObservableCollection生成

。什么!它们只是参数。为什么我要“观察”它们?

如果我这样做我很好 - 但是当我知道我从来没有数据绑定时,似乎应该有一种强制简单数组结构的方法 - 特别是在输入消息上。 / p>

我宁愿这样做:

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

比这个:

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

有办法吗?

PS。我实际上使用SearchCriteria对象作为我的搜索条件 - 但我简化了这个例子,想知道参数的处理方式是否不同。

4 个答案:

答案 0 :(得分:4)

您可以在服务范围内执行此操作,但不能基于每个方法执行此操作。在“添加服务引用”对话框中,单击“高级”,然后为“集合”类型选择“System.Array”。但我不知道有任何方法可以逐个方法地进行,即对某些方法使用数组,对其他方法使用ObservableCollection。

答案 1 :(得分:0)

在我习惯使用ObservableCollection为我的silverlight客户端之后,这是一个奇怪的转折。

我尝试从我的WCF服务返回一个Linq2XSD对象 - 然后突然降低,并且看到它将所有ObservableCollection<T>属性更改为简单数组[]

我认为这是Linq2XSD特有的 - 所以我尝试在服务定义中添加一个简单的XTypedElement属性:

    public XTypedElement[] PipelineLogs { get; set; }

这会在生成的代理中触发[]而不是ObservableCollection<T> - 通常string[]将成为ObservableCollection<string>

不要问我为什么!

我已删除它,因为我实际上更喜欢ObservableCollection<T>。我只是认为观察可能会引起类似问题的人的兴趣 - 特别是如果有人能解释为什么会这样做的话!

答案 2 :(得分:0)

当VS2010 RC出现阻止它生成ObservableCollections的错误时,结束了OPPOSITE问题。

幸运的是there are two workarounds

选项1: 相信最好的选择 - 这是为受影响的服务引用更新“Reference.svcmap”文件。在“解决方案资源管理器”中,选择“显示所有文件”并展开受影响的引用节点。在那里你会找到“Reference.svcmap”文件,双击打开编辑器。对于observablecollection映射,您应该看到类似这样的内容:

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

更改TypeName值以包含Silverlight程序集“System.Windows” - 如下所示:

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

选项2 :生成您的   Reference.vb / .cs服务参考   VS之外的代理代码文件   直接使用SLSvcUtil.exe。例   通过命令行运行该工具   它将解决的问题   observablecollection问题代码   生成问题:“C:\ Program Files   (x86)的\微软   软件开发工具包\ Silverlight的\ 3.0 \工具\ SlSvcUtil.exe”   / 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版,你可以传递一个   “/语言:VB”切换。

答案 3 :(得分:0)

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

确保您在typename中包含了“System.Windows”。

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

而不是

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

我猜它可能无法找到Dll并默认为[]