遍历CompositeCollection中的项目

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

3个回答

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


这将迭代仅第一级CollectionContainer,而不会获得结果。 - Amr Badawy
2
这是一个不错的技巧。难道没有直接做的方法吗? ListBox怎么看到字符串的?它使用什么? - Dudu

2

对于ListBox,它使用默认视图作为ItemsSource属性的值,您也可以使用:

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

您可以使用 ICollectionView 类来对 ItemsSource 进行排序或筛选,但是请注意,这在处理 CompositeCollection 时可能无法正常工作,如您可以参考此问题:如何使用CollectionView功能处理CompositeCollection?

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);

这是一个不错的技巧。没有一种直接的方法吗? ListBox 如何看到字符串?它使用什么? - Dudu
你所说的“直接”是什么意思? - Amr Badawy
类似以下代码:foreach(var itm in cmpc) - Dudu
这已经是我在上面的代码中所做的了,我只是让你的foreach循环提取字符串并将其作为ListBox的数据源返回...你能否向我澄清您需要什么? - Amr Badawy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接