Преобразователь останавливает работу фильтра

Я пытаюсь отобразить имена файлов в поле списка, полученном из конкретного каталога. Они хранятся в 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
задан Michael Sandler 3 August 2010 в 09:51
поделиться

1 ответ

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

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

2
ответ дан 2 September 2019 в 22:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: