2010-06-09 179 views
4

的項目考慮代碼:迭代通過CompositeCollection

ObservableCollection<string> cities = new ObservableCollection<string>(); 
ObservableCollection<string> states = new ObservableCollection<string>(); 

ListBox list; 

cities.Add("Frederick"); 
cities.Add("Germantown"); 
cities.Add("Arlington"); 
cities.Add("Burbank"); 
cities.Add("Newton"); 
cities.Add("Watertown"); 
cities.Add("Pasadena"); 

states.Add("Maryland"); 
states.Add("Virginia"); 
states.Add("California"); 
states.Add("Nevada"); 
states.Add("Ohio"); 

CompositeCollection cmpc = new CompositeCollection(); 
CollectionContainer cc1 = new CollectionContainer(); 
CollectionContainer cc2 = new CollectionContainer(); 

cc1.Collection = cities; 
cc2.Collection = states; 

cmpc.Add(cc1); 
cmpc.Add(cc2); 

list.ItemsSource = cmpc; 

foreach(var itm in cmpc) 
{ 
    // itm is CollectionContainer and there are only two itm’s 
    // I need the strings 
} 

在列表中顯示的GUI

我需要這個數據(不涉及到ListBox)正確的數據,我沒有得到它

回答

1

您應該從cmpc項提取數據,並將它們設置爲數據源,如list.ItemsSource不會理解您需要將內部項目設置爲數據源
編輯

您可以使用此方法

List<string> GetData(CompositeCollection cmpc) 
     { 
      List<string> allStrings = new List<string>(); 
      foreach (var item in cmpc) 
      { 
       allStrings.AddRange(item.OfType<string>()); 
      } 
      return allStrings; 
     } 

,並設置數據源

list.ItemsSource = GetData(cmpc); 
+0

他是一個很好的把戲。有沒有辦法直接做到這一點? ListBox如何看到字符串?它使用什麼? – Dudu 2010-06-09 11:06:27

+0

你是直接指什麼? – 2010-06-09 11:50:23

+0

東西在線:foreach(var itm in cmpc) – Dudu 2010-06-14 09:01:02

4

試試這個:foreach (var itm in cmpc.Cast<CollectionContainer>().SelectMany(x => x.Collection.Cast<string>()))

+0

這將迭代爲唯一的第一級CollectionContainer,將不會得到結果 – 2010-06-09 10:51:40

+0

已更新的答案以反映您的評論(您是正確的)。 – 2010-06-09 11:02:44

+2

這是一個不錯的技巧。有沒有辦法直接做到這一點? ListBox如何看到字符串?它使用什麼? – Dudu 2010-06-09 11:06:04

1

ListBox用於其ItemsSource屬性的默認視圖收集,你也可以使用它:

foreach (string itm in CollectionViewSource.GetDefaultView(cmpc)) 
    { 
    Debug.Print(itm); 
    } 

可以使用ICollectionView類排序或篩選的ItemsSource,但要小心,而這不會CompositeCollection s請正確地工作,因爲你可以看到這樣一個問題:How to handle a CompositeCollection with CollectionView features?