2010-08-03 83 views
1

我想在一個列表框中顯示文件名,從一個特定的目錄中檢索。它們存儲在FileInfo的對象的一個​​ObservableCollection:轉換器停止過濾器工作

public ObservableCollection<FileInfo> ProjectFiles 
{ 
    get 
    { 
     if (SelectedFolder == null) return null; 

     DirectoryInfo d= new DirectoryInfo(SelectedFolder); 

     if (!d.Exists) return null; 

     return new ObservableCollection<FileInfo>(d.EnumerateFiles("*.xsi")); 
    } 
} 

我已經實現在列表框的過濾器,當輸入或更改文本的文本框「FilesFilterBy」之稱:

private void FilterFiles_TextChanged(object sender, TextChangedEventArgs e) 
{ 
    ICollectionView view = CollectionViewSource.GetDefaultView(ProjectFiles); 
    view.Filter = new Predicate<object>(IsTextInFilename); 
} 

public bool IsTextInFilename(object item) 
{ 
    string Filename = Path.GetFileNameWithoutExtension((item as FileInfo).Name); 
    return (Filename.ToLower().Contains(FilesFilterBy.Text.ToLower())); 
} 

在同一時間,我只想顯示文件的名稱,沒有路徑或擴展名。爲此我實現了一個轉換器:

public class RemoveExtensionConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
    return Path.GetFileNameWithoutExtension(value as string); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return new NotImplementedException(); 
    } 
} 

這裏是如何列表框在XAML實現:

<Window.Resources> 
    <ctr:RemoveExtensionConverter x:Key="JustFileName" /> 
</Window.Resources> 

<ListBox ItemsSource="{Binding ProjectFiles}" > 
    <ListBox.ItemTemplate> 
    <DataTemplate> 
     <TextBlock Text="{Binding FullName, Converter={StaticResource JustFileName}}" /> 
    </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

目前轉爐工程 - 只有文件名都列出來,但過濾不再有什麼作用。當我在FileFilterBy文本框中輸入文本時,TextChanged事件被觸發,但列表框保持不變。此外,轉換器不會在此時被調用。

我在做什麼錯?

回答

2

ProjectFiles每次都會返回一個新的集合。你的FilterFiles_TextChanged處理程序正在調用ProjectFiles來創建一個新的集合,在該集合上設置一個篩選器,然後將其丟棄。綁定到ListBox的集合不受影響。您需要更改ProjectFiles以保持相同的集合對象。也許像這樣:

private ObservableCollection<FileInfo> _projectFiles; 
public ObservableCollection<FileInfo> ProjectFiles 
{ 
    get 
    { 
     if (_projectFiles == null) 
     { 
      if (SelectedFolder == null) return null; 

      DirectoryInfo d = new DirectoryInfo(SelectedFolder); 

      if (!d.Exists) return null; 

      _projectFiles = new ObservableCollection<FileInfo>(
       d.EnumerateFiles("*.xsi")); 
     } 
     return _projectFiles; 
    } 
} 

轉換器應該不會影響過濾器。

+0

謝謝。 – 2010-08-03 13:06:15