5

考虑代码:

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)但我没有得到它

4

3 回答 3

4

尝试这个:foreach (var itm in cmpc.Cast<CollectionContainer>().SelectMany(x => x.Collection.Cast<string>()))

于 2010-06-09T10:43:43.530 回答
2

ListBox它的属性使用集合ItemsSource的默认视图,您也可以使用它:

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

您可以使用这些ICollectionView类对 进行排序或过滤ItemsSource,但要小心,因为这不适用于CompositeCollections,因为您可以看到这个问题:How to handle a CompositeCollection with CollectionView features?

于 2014-01-09T11:21:57.453 回答
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);
于 2010-06-09T10:38:54.587 回答