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