高级列表用法(过滤可枚举项)

时间:2013-11-20 23:00:04

标签: c# .net silverlight windows-phone-7 listbox

我的App中有一个ListBox。此外,我有一个项目的集合,每个项目都有里面的项目集合。所以,实际上它是一棵树,我想像文件夹/文件一样显示它们。

class item
{
 ...
 List<item> childItems;
}

有不同类型的项目,其中一些不是文件夹或文件,我不想显示它们(它们都具有相同的基本类型)。

所以,我是c#的新手,但我觉得应该有在运行时过滤项目的方法。也许当ListBox试图从List获取项目并填充自己时,因为我听到了一些关于c#中可枚举数组的内容。

在c ++中,我手动填充ListCtrl,但在c#中有一个绑定,很酷。目前我将项目复制到ObservableCollection,过滤不需要的项目,然后将此集合用作带有ListBox的itemsSouce。也许还有另一种方法可以在运行时过滤项目?我认为我应该从c#List中提供自己的List并使用可枚举的接口做一些事情,是吗?

1 个答案:

答案 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。