【发布时间】:2010-08-03 09:51:42
【问题描述】:
我正在尝试在列表框中显示从特定目录检索的文件名。它们存储在 FileInfo 对象的 ObservableCollection 中:
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 事件,但列表框保持不变。此外,此时不会调用转换器。
我做错了什么?
【问题讨论】: