.net 遍历CompositeCollection的项

.net 遍历CompositeCollection的项,.net,compositecollection,.net,Compositecollection,以代码为例: ObservableCollection<string> cities = new ObservableCollection<string>(); ObservableCollection<string> states = new ObservableCollection<string>(); ListBox list; cities.Add("Frederick"); cities.Add("Germantown"); citi

以代码为例:

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
}
observetecollection cities=新observetecollection();
ObservableCollection状态=新的ObservableCollection();
列表框列表;
城市。添加(“弗雷德里克”);
城市。添加(“德国城”);
城市。添加(“阿灵顿”);
城市。添加(“伯班克”);
城市。添加(“牛顿”);
城市。添加(“水城”);
城市。添加(“帕萨迪纳”);
添加(“马里兰州”);
添加(“弗吉尼亚”);
添加(“加利福尼亚”);
添加(“内华达州”);
添加(“俄亥俄州”);
CompositeCollection cmpc=新的CompositeCollection();
CollectionContainer cc1=新的CollectionContainer();
CollectionContainer cc2=新的CollectionContainer();
cc1.集合=城市;
cc2.收集=状态;
cmpc.Add(cc1);
cmpc.Add(cc2);
list.ItemsSource=cmpc;
foreach(cmpc中的var itm)
{
//itm是CollectionContainer,只有两个itm
//我需要绳子
}
而列表在GUI上显示正确的数据


我需要这些数据(不参考列表框),但我得不到它

您应该从cmpc项目中提取数据,并将其设置为数据源作为列表。项目资源不理解您需要将项目的内部项目设置为数据源
编辑

您可以使用此方法

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

尝试以下操作:
foreach(cmpc.Cast()中的var itm.SelectMany(x=>x.Collection.Cast())
列表框的
ItemsSource
属性使用集合的默认视图,您也可以使用该视图:

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

您可以使用
ICollectionView
类对
ItemsSource
进行排序或筛选,但在使用
CompositeCollection
时要小心,因为这将无法正常工作,正如您所看到的,这个问题:

这将对唯一一个不会得到结果的一级CollectionContainer进行迭代这是一个很好的技巧。难道没有办法直接做到这一点吗?为什么列表框会看到字符串?这有什么用?这是一个很好的把戏。有没有办法直接做呢?为什么列表框会看到字符串?它使用什么?你说的直接是什么意思?在:foreach(cmpc中的var-itm)这一行中的一些东西已经是我在上面的代码中所做的,我只是让你的foreach循环提取字符串并将其作为ListBox的数据源返回。。。你能告诉我你到底需要什么吗?
  foreach (string itm in CollectionViewSource.GetDefaultView(cmpc))
  {
    Debug.Print(itm);
  }