2012-03-04 105 views
2

我有三个类泛型列表转换

public class OSiteEquipment : IPlantItem 
public class OSiteSubSystem : IPlantItem 
public class OSiteComponent : IPlantItem 

各自实现接口IPlantItem

在我的XAML我绑定到一个观察集合像

public ObservableCollection<IPlantItem> CurrentItems 

有时我需要绑定CurrentItems到收集OSiteEquipments,有时还收集到OSiteSubSystem

如果我尝试当我加载像这样

CurrentItems = this.siteDocument.Sitestructure.Equipments; 

哪里Sitestructure.Equipments是OSiteEquipment的可观察集合的视图,设置CurrentItems,编译说我不能从Observablecollection<IPlantItem>转换为Observablecollection<OSiteEquipment>

是否有解决此问题的方法。我需要做出明确的转换

编辑

解决它,而不是定义CurrentItems作为的ObservableCollection我作为

object CurrentItems 

我之所以做这一切并不是在一开始是我thougt我会销毁通知绑定,但它仍然正常工作。

+0

为什么你想避免显式转换? – 2012-03-04 20:28:18

+3

'Observablecollection '不是'Observablecollection '。所以当然编译器对象。 – 2012-03-04 20:30:28

+0

看起来像'ObservableCollection'不是协变的,所以需要显式转换。 – knittl 2012-03-04 20:51:27

回答

2

ObservableCollection<OSiteEquipment>Observablecollection<IPlantItem>的明确转换也不起作用。如果您想使用此功能,则需要将OSiteEquipment系列的元素复制到新的IPlantItem。但是,对原始集合的更改不会影响新集合,因此这不是您想要的。

您已经找到了解决方案,但我认为如果您将CurrentItems的类型更改为IEnumerable<IPlantItem>将会更好。这不应该影响绑定,但这意味着您的代码更安全,更自我记录(更明显,该属性应该是什么)。

+0

好点,谢谢 – klashagelqvist 2012-03-04 21:18:53