转换器停止过滤器工作

时间:2010-08-03 09:51:43

标签: wpf filter converter

我正在尝试在列表框中显示文件名,从特定目录中检索。它们存储在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事件,但列表框保持不变。此外,此时不调用转换器。

我做错了什么?

1 个答案:

答案 0 :(得分: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;
    }
}

转换器根本不应影响过滤器。