我的App中有一个ListBox。此外,我有一个项目的集合,每个项目都有里面的项目集合。所以,实际上它是一棵树,我想像文件夹/文件一样显示它们。
class item
{
...
List<item> childItems;
}
有不同类型的项目,其中一些不是文件夹或文件,我不想显示它们(它们都具有相同的基本类型)。
所以,我是c#的新手,但我觉得应该有在运行时过滤项目的方法。也许当ListBox试图从List获取项目并填充自己时,因为我听到了一些关于c#中可枚举数组的内容。
在c ++中,我手动填充ListCtrl,但在c#中有一个绑定,很酷。目前我将项目复制到ObservableCollection,过滤不需要的项目,然后将此集合用作带有ListBox的itemsSouce。也许还有另一种方法可以在运行时过滤项目?我认为我应该从c#List中提供自己的List并使用可枚举的接口做一些事情,是吗?
答案 0 :(得分:2)
我不确定你的过滤逻辑到底是什么样的,但是你可以创建一个像你这样绑定的过滤属性......
class item
{
...
List<item> childItems;
public IEnumerable<item> FileSystemItems
{
get
{
return childItems.Where(x => x is IFile || x is IFolder);
}
}
}
编辑:WP7.1没有IEnumerable.Where
我手工编辑了这个并且无法编译它所以请耐心等待...但是没有使用。它可能看起来像这样......
public List<item> FileSystemItems
{
get
{
var list = new List<item>();
foreach (child in childItems)
{
if (child is IFile || child is IFolder)
list.Add(child);
}
return list;
}
}
显然,无论你的实际过滤策略是什么,都要将IFile和IFolder取代。
你的列表框绑定看起来像这样......(这是WPF,但据我所知,silverlight是相同的)
<ListBox ItemsSource="{Binding FileSystemItems}">
我的完整WPF绑定看起来像这样..
<ListBox ItemsSource="{Binding FileSystemItems}">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}"></TextBlock>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
您需要更换... {Binding Name}
部分...将Name
替换为您希望在列表框中显示的任何属性...或者您可以将其保留为关闭没有使用ItemTemplate。