ICollectionView Filter won't refresh -是我的绑定错误

本文关键字:我的 绑定 错误 refresh won Filter ICollectionView | 更新日期: 2023-09-27 18:16:22

我正在编写一个程序来查看图像,按文件名列出它们,并有一个用于搜索的文本框,当您输入列表时,它会自动过滤列表。

我可以看到过滤器实际上在工作-它看起来好像刷新也在触发-但是它没有在屏幕上"刷新"。

public MainWindow()
{
    InitializeComponent();
    DataContext = this;
    ICollectionView collectionView = CollectionViewSource.GetDefaultView(AllImages);
    new DynamicFiltering(collectionView, this.TextBoxFilter);
}
public class DynamicFiltering
{
    public DynamicFiltering(ICollectionView filteredView, TextBox textBox)
    {
        string filterText = "";
        filteredView.Filter = delegate(object item)
        {
            MyImages textvalue = item as MyImages;
            string textvaluestring = textvalue.Name as string;
            if (textvaluestring.ToUpper().Contains(filterText.ToUpper()))
                return true;
            else
                return false;
        };
        textBox.TextChanged += delegate
        {
            filterText = textBox.Text;
            filteredView.Refresh();
        };
    }
}

, xaml是

<TextBox x:Name="TextBoxFilter"/>
<ListBox Name="VisualList"
         Template="{StaticResource StandardListBox}"
         DataContext="{Binding AllImages}"
         ItemsSource="{Binding}"
         Width="Auto"
         Grid.Row="1"/>

列表框绑定有问题吗?另一件值得注意的事情是,我在我的列表中的每个对象中持有字符串和图像资源。


编辑:下面是我用来填充allimage的代码——以Environment.SpecialFolder.MyPictures为例。

    public class MyImages
    {
        public ImageSource _image;
        public string _name;
        public MyImages(ImageSource image, string name)
        {
            _image = image;
            _name = name;
        }
        public override string ToString()
        {
            return _name;
        }
        public ImageSource Image
        {
            get { return _image; }
        }
        public string Name
        {
            get { return _name; }
        }
    }
    public List<MyImages> AllImages
    {
        get
        {
            List<MyImages> result = new List<MyImages>();
            foreach (string filename in
                System.IO.Directory.GetFiles(
                Environment.GetFolderPath(
                Environment.SpecialFolder.MyPictures)))
            {
                try
                {
                    result.Add(
                    new MyImages(
                    new BitmapImage(
                    new Uri(filename)),
                    System.IO.Path.GetFileNameWithoutExtension(filename)));
                }
                catch { }
            }
            return result;
        }
    }

ICollectionView Filter won't refresh -是我的绑定错误

你的直觉是正确的,问题出在你的绑定上。您的ItemsSource没有绑定到您的过滤器正在使用的相同视图实例。试试这样:

    public ICollectionView CollectionView { get; set; }
    public MainWindow()
    {
        InitializeComponent(); 
        DataContext = this;
        CollectionView = CollectionViewSource.GetDefaultView(AllImages);
        new DynamicFiltering(CollectionView, this.TextBoxFilter);
    }
    <ListBox Name="VisualList" 
         DataContext="{Binding CollectionView}" 
         ItemsSource="{Binding}" 
         Width="Auto" 
         Grid.Row="1"/>

不调用Refresh,只需重新设置过滤器

你的感觉是对的,问题出在Listbox的绑定上。删除DataContext设置,然后设置ItemsSource="{Binding AllImages}"