【问题标题】:Iterating through items of CompositeCollection遍历 CompositeCollection 的项目
【发布时间】:2010-06-09 09:56:15
【问题描述】:

考虑代码:

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

【问题讨论】:

    标签: .net compositecollection


    【解决方案1】:

    试试这个:foreach (var itm in cmpc.Cast&lt;CollectionContainer&gt;().SelectMany(x =&gt; x.Collection.Cast&lt;string&gt;()))

    【讨论】:

    • 这将迭代唯一不会得到结果的第一级 CollectionContainer
    • 这是一个不错的技巧。没有办法直接做到吗? ListBox 怎么会看到字符串?它有什么用?
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      您应该从 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 怎么会看到字符串?它有什么用?
      • 你说的直接是什么意思?
      • 某事在以下行:foreach(var itm in cmpc)
      • 这已经是我在上面的代码中所做的了,我只是让你的 foreach 循环提取字符串并将其作为 ListBox 的数据源返回......你能告诉我你到底需要什么吗?跨度>
      猜你喜欢
      • 2012-09-07
      • 1970-01-01
      • 1970-01-01
      • 2018-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多