Конвертер перестает работать фильтр - PullRequest
1 голос
/ 03 августа 2010

Я пытаюсь отобразить имена файлов в списке, извлеченном из определенного каталога. Они хранятся в 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"));
    }
}

Я реализовал фильтр в списке, который вызывается при вводе или изменении текста в текстовом поле «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, но список остается неизменным. Кроме того, конвертер в этот момент не вызывается.

Что я делаю не так?

1 Ответ

2 голосов
/ 03 августа 2010

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

Конвертер не должен влиять на фильтр вообще.

...