考虑代码:
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)而且我没有得到它
答案 0 :(得分:4)
试试这个:foreach (var itm in cmpc.Cast<CollectionContainer>().SelectMany(x => x.Collection.Cast<string>()))
答案 1 :(得分: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);
答案 2 :(得分:1)
ListBox
用于其ItemsSource
属性集合的默认视图,您也可以使用它:
foreach (string itm in CollectionViewSource.GetDefaultView(cmpc))
{
Debug.Print(itm);
}
您可以使用ICollectionView
类对ItemsSource
进行排序或过滤,但在使用CompositeCollection
时无法正常使用,因为您可以看到以下问题:{ {3}}