Vb.net 强制转换我的列表框。选择编辑项以更正类型

Vb.net 强制转换我的列表框。选择编辑项以更正类型,vb.net,wcf,silverlight,Vb.net,Wcf,Silverlight,我正在使用SL5和WCF用数据填充我的列表框。WCF方法返回一个List(Of Unit),我正试图将它转换为客户机上的List(Of MyService.Unit)。调试时,我可以看到lsbItems。SelectedItems的计数大于0,但它不会转换,并且我的变量是Nothing。这个Listbox在一个网格中-grdItems我在这里缺少什么 在XAML中: <ListBox ItemsSource="{Binding}" Name="lsbItems"> <Ite

我正在使用
SL5
WCF
用数据填充我的
列表框。
WCF
方法返回一个
List(Of Unit)
,我正试图将它转换为客户机上的
List(Of MyService.Unit)
。调试时,我可以看到
lsbItems。SelectedItems
的计数大于0,但它不会转换,并且我的变量是
Nothing
。这个
Listbox
在一个网格中-
grdItems
我在这里缺少什么

在XAML中:

<ListBox ItemsSource="{Binding}" Name="lsbItems">
  <ItemsControl.ItemTemplate>
    <DataTemplate>
      <TextBlock Text="{Binding Path=Description}" />
    </DataTemplate>
  </ItemsControl.ItemTemplate>
</ListBox>
转换:

Dim units = TryCast(lsbItems.SelectedItems, List(Of MyService.Unit))

ListBox.SelectedItems
是一个
IList
,而不是一个
列表(MyService.Unit)
,因此您的TryCast应该不会返回任何内容。IList提供了一个名为[Cast][1]的方法作为扩展方法。因此,您可以这样做:

Dim list As IEnumerable(Of MyService.Unit) = lsbItems.SelectedItems.Cast(Of MyService.Unit)()
作为一种扩展方法,它通过延迟执行来工作,因此,在您开始枚举对象之前,不会发生实际的转换

当然,您也可以采取稍微重一点的方法,简单地将项目复制到一个新列表中,如下所示:

Dim list As List(Of MyService.Unit) = New List(Of MyService.Unit)
For Each item As MyService.Unit In lsbItems.SelectedItems
    list.Add(item)
Next
请原谅这里的任何错误——这些都是使用BrainCompiler 1.0在iPhone上输入的,因此我还没有时间测试它

Dim list As List(Of MyService.Unit) = New List(Of MyService.Unit)
For Each item As MyService.Unit In lsbItems.SelectedItems
    list.Add(item)
Next