2011-01-20 6 views
0

C#에서 ObservableCollection 개체가 있습니다. 이 객체는 인터페이스를 구현합니다. 컬렉션을 통해 구문 분석 할 필요없이 ObservableCollection 개체의 ObservableCollection 인터페이스로 변환 할 수 싶습니다. 그래서 예를 들면명시 적 ObservableCollection 캐스팅

:

나는 "IMusicalInstrument"라는 인터페이스를 구현하는 객체 "기타"가. MyListBox에 기타 객체의 ObservableCollection을 바인딩합니다. 다음 코드 줄을 사용하여 목록 상자 itemsSource를 ObservableCollection으로 변환 할 수 있습니다.

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

현재, 저에게 InvalidCastException이 제공됩니다.

컬렉션을 분석 할 필요없이이를 수행 할 수있는 방법이 있습니까?

덕분에, 세스

답변

1

MyListBox.ItemsSource하지 않는 한 ObservableCollection<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>(); 

....

또한 단순히 ObservableCollection<T>의 생성자에 IEnumerable<T> 참조를 전달할 수 있습니다 ...

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

ObservableCollection에 이미이 작업을 수행 생성자를 가지고있다. – porges

+0

@Porges Yep ... 추가 가능성으로 추가했습니다 ... –

+0

물론 원본에 대한 항목을 제공하는 새로운 관찰 가능한 컬렉션을 제공하지 않습니다. –