开始学习C#/ XAML,所以很可能没有以正确的方式做到这一点。 我正在编写一个程序来查看图像,按文件名列出它们,并有一个用于搜索的文本框,可以在您键入时自动过滤列表。
我已经多次浏览了我的C#代码并且我可以看到过滤器实际上正在工作 - 看起来好像刷新也是如此 - 但是我无法直观地在屏幕上过滤或“刷新”。
框的C#如下
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"/>
我有一种感觉问题出在列表框绑定中,但我无法确定真正的根本原因。另一件值得注意的事情是我在列表中的每个对象中都有一个字符串和imagesource。
非常感谢任何帮助!
编辑: 下面是我用来填充AllImages的代码 - 使用Environment.SpecialFolder.MyPictures作为示例。 公共课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;
}
}
答案 0 :(得分:3)
你的直觉正常,问题源于你的绑定。您的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"/>
答案 1 :(得分:1)
而不是调用Refresh,只需再次设置过滤器。
答案 2 :(得分:0)
你的感觉是对的,问题在于Listbox的绑定。删除DataContext设置,然后设置ItemsSource="{Binding AllImages}"