2011-01-20 44 views
0

我有一個C#中的對象的ObservableCollection。這個對象實現了一個接口。我希望能夠將對象的ObservableCollection轉換爲接口的ObservableCollection,而無需解析集合。演示顯式ObservableCollection

因此,例如:

我有一個對象「吉他」,它實現了一個名爲「IMusicalInstrument」的接口。我將一個ObservableCollection的吉他對象綁定到MyListBox。我想要下面這行代碼能夠將listbox itemsSource轉換爲ObservableCollection。

ObservableCollection<IMusicalInstrument> InstrumentList = 
(ObservableCollection<IMusicalInstrument>)MyListBox.ItemsSource; 

目前,這是給我一個InvalidCastException。

有沒有辦法做到這一點(無需通過收集解析)?

感謝, 賽斯

回答

1

除非MyListBox.ItemsSourceObservableCollection<IMusicalInstrument>一個實例,則沒有,你不能施放它。

1

對不起,您不能這樣做,因爲ObservableCollection<Guitar>不能被視爲ObservableCollection<IMusicalInstrument> - 例如,你不能打電話給collection.Add(new Flute())

0

如果您只想管理集合的項目,那麼您可以嘗試將ItemsSource強制轉換爲非通用IList。

0

如果您僅使用ObservableCollection來處理收集已更改的事件,則可以將其轉換爲INotifyCollectionChanged並添加您的事件處理程序。 INotifyCollectionChanged不使用泛型,因此無論如何您都必須在您的事件處理程序中投射。但是,如果要枚舉IMusicalInstrument實例的集合,則可以使用Linq Cast()擴展方法。例如

IEnumerable<IMusicalInstrument> instruments = 
    ((IEnumerable)MyListBox.ItemsSource).Cast<IMusicalInstrument>(); 

希望有所幫助!

1

你不能施放它,但是一種方法是包裝你的迭代,我知道你想避免,但不幸的是不能進入extension method

public static class CollectionExtensions 
{ 
    public static ObservableCollection<T> ToObservableCollection<T>(this IEnumerable<T> enumerableList) 
    { 
     if (enumerableList != null) 
     { 
      //create an emtpy observable collection object 
      var observableCollection = new ObservableCollection<T>(); 

      //loop through all the records and add to observable collection object 
      foreach (var item in enumerableList) 
       observableCollection.Add(item); 

      //return the populated observable collection 
      return observableCollection; 
     } 
     return null; 
    } 
} 

這將允許你這樣做......

ObservableCollection<IMusicalInstrument> InstrumentList = MyListBox.ItemsSource.ToObservableCollection<IMusicalInstrument>(); 

...這是什麼,我相信你是後。

你也可以簡單地通過IEnumerable<T>引用到的ObservableCollection<T>構造...

ObservableCollection<IMusicalInstrument> InstrumentList = new ObservableCollection<IMusicalInstrument>(MyListBox.ItemsSource); 
+1

的ObservableCollection已經有一個構造函數執行此操作。 – porges 2011-01-20 21:59:04