【问题标题】:Converter stops filter working转换器停止过滤器工作
【发布时间】: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 事件,但列表框保持不变。此外,此时不会调用转换器。

我做错了什么?

【问题讨论】:

    标签: wpf filter converter


    【解决方案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;
        }
    }
    

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

    【讨论】:

      猜你喜欢
      • 2016-10-14
      • 1970-01-01
      • 2013-12-04
      • 2016-03-14
      • 2017-12-02
      • 2022-11-11
      • 2018-02-25
      • 2017-11-25
      • 1970-01-01
      相关资源
      最近更新 更多