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;
}
}
你的直觉是正确的,问题出在你的绑定上。您的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}"