在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对象作为我的搜索条件 - 但我简化了这个例子,想知道参数的处理方式是否不同。
答案 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并默认为[]