2013-11-20 72 views
1

我的應用程序中有一個ListBox。此外,我還收集了一些物品,每個物品都收集了物品的內容。所以,實際上它是一棵樹,我想將它們顯示爲文件夾/文件。高級列表用法(篩選器可枚舉項)

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

有不同類型的項目,其中一些是不是文件夾或文件,我不希望顯示它們(它們都具有相同的基本類型)。

所以,我是新的C#,但我覺得應該有辦法在運行時過濾項目。也許當ListBox試圖從列表中獲取項目並填充它自己時,因爲我聽說了關於c#中的可枚舉數組。

在C++中手動填充ListCtrl,但在C#中有一個綁定,它很酷。目前我將這些項目複製到ObservableCollection中,過濾不需要的項目,然後將此集合作爲itemsSouce與ListBox一起使用。也許有另一種方法來在運行時過濾項目?我認爲我應該從C#List中發佈我自己的列表,並使用可枚舉的接口來做些什麼,是的?

回答

2

我不知道究竟你的過濾邏輯是什麼樣子,但你可以創建,綁定到這樣的過濾特性...

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

    public IEnumerable<item> FileSystemItems 
    { 
     get 
     { 
      return childItems.Where(x => x is IFile || x is IFolder); 
     } 
    } 
} 

編輯:WP7.1不具備的IEnumerable 。凡

我手動編輯這並不能編譯這麼容忍我...但wihtout使用。凡可能是這個樣子......

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,則可以將其關閉。

+0

FileSystemItemse如何被ListBox調用?它看起來像我應該調用它並通過自我傳遞給ListBox。 – crea7or

+0

那麼,它不會像我看到的那樣創建新的列表? – crea7or

+0

List.Where不支持Windows Phone 7.1 :(只有Wp8。http://msdn.microsoft.com/en-us/library/bb549418(v=vs.110).aspx – crea7or