Итерация по элементам CompositeCollection - PullRequest
4 голосов
/ 09 июня 2010

Рассмотрим код:

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
}

Хотя в списке отображаются правильные данные в графическом интерфейсе

Мне нужны эти данные (без ссылки на ListBox), и я не получаю их

Ответы [ 3 ]

4 голосов
/ 09 июня 2010

Попробуйте это: foreach (var itm in cmpc.Cast<CollectionContainer>().SelectMany(x => x.Collection.Cast<string>()))

1 голос
/ 09 января 2014

ListBox использует для своего свойства ItemsSource представление коллекции по умолчанию, которое вы также можете использовать:

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

Вы можете использовать классы ICollectionView для сортировки или фильтрации ItemsSource, но будьте осторожны, пока это не будет работать должным образом с CompositeCollection с, как вы видите этот вопрос: Как обращаться CompositeCollection с функциями CollectionView?

1 голос
/ 09 июня 2010

Вы должны извлечь данные из элементов 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);
...