2012-03-04 106 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