2010-08-03 2 views
1

Я пытаюсь отобразить имена файлов в списке, извлеченные из определенного каталога. Они хранятся в ObservableCollection объектов FileInfo:Конвертер прекращает работу фильтра

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

я реализовал фильтр на ListBox, вызывается, когда текст вводится или изменен в текстовом поле «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(); 
    } 
} 

Здесь не как ListBox реализуется в 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

Благодарим вас. –

Смежные вопросы