2010-08-03 6 views
1

J'essaie d'afficher les noms de fichiers dans une liste, récupérés dans un répertoire particulier. Ils sont stockés dans un ObservableCollection d'objets FileInfo:Le convertisseur arrête le fonctionnement du filtre

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")); 
    } 
} 

J'ai mis en place un filtre sur la zone de liste, appelée lorsque le texte est entré ou modifié dans une zone de texte « 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())); 
} 

Dans le même Je souhaite afficher uniquement les noms des fichiers, sans chemin ni extension. A cette fin, je l'ai mis en place un convertisseur:

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(); 
    } 
} 

Voici comment le listbox est mis en œuvre en 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> 

fonctionne actuellement le convertisseur - seuls les noms de fichiers sont répertoriés, mais le filtre ne a un effet. Lorsque je saisis du texte dans la zone de texte FileFilterBy, l'événement TextChanged est déclenché mais la zone de liste reste la même. De plus, le convertisseur n'est pas appelé à ce moment-là.

Qu'est-ce que je fais mal? ProjectFiles renvoie une nouvelle collection à chaque fois.

Répondre

2

Votre gestionnaire FilterFiles_TextChanged appelle ProjectFiles pour créer une nouvelle collection, définir un filtre sur cette nouvelle collection, puis le supprimer. La collection liée à ListBox n'est pas affectée. Vous devez modifier ProjectFiles pour conserver le même objet de collection. Peut-être quelque chose comme ceci:

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; 
    } 
} 

Le convertisseur ne devrait pas du tout affecter le filtre.

+0

Merci beaucoup. –