筛选xaml列表框
本文关键字:列表 xaml 筛选 | 更新日期: 2023-09-27 18:21:15
嗨,我有一个包含一些客户名称的列表框,我想根据在TextBox中输入的文本过滤列表。经过一番研究,我听说我们可以使用CollectionViewSourse和ICollectionView,但没有达到我可以使用它的阶段。
你能就如何实现这一目标提出建议吗。
非常感谢你的帮助。
XAML
<TextBox x:Name="txtSearch"/>
<ListBox x:Name="lbCustomers">
XAML.cs
List<string> customerList;
public MainPage()
{
this.InitializeComponent();
customerList = new List<string>();
customerList.Add("Andrew");
customerList.Add("bravo");
customerList.Add("Carol");
customerList.Add("Dela");
customerList.Add("Eva");
customerList.Add("family");
customerList.Add("George");
customerList.Add("Health");
customerList.Add("Illa");
customerList.Add("Jack");
customerList.Add("Andrew");
lbCustomers.ItemsSource = customerList;
CollectionViewSource collectionViewSource = new CollectionViewSource();
collectionViewSource.Source = customerList;
ICollectionView collectionView = collectionViewSource.View;
}
编辑:我无法访问"CollectionViewSource.GetDefaultView"answers"view.Filter"。我收到错误:"CollectionViewSource不包含GetDefaultView"的定义
当我查看定义时,我没有找到"GetDefaultView"answers"Filter dependency properties"
public sealed class CollectionViewSource : DependencyObject, ICollectionViewSource
{
public CollectionViewSource();
public static DependencyProperty IsSourceGroupedProperty { get; }
public static DependencyProperty ItemsPathProperty { get; }
public static DependencyProperty SourceProperty { get; }
public static DependencyProperty ViewProperty { get; }
public System.Boolean IsSourceGrouped { get; set; }
public PropertyPath ItemsPath { get; set; }
public System.Object Source { get; set; }
public ICollectionView View { get; }
}
尝试获取集合的默认集合视图。每次您的txtSearch更改时,您都必须更改筛选器。
ICollectionView view = CollectionViewSource.GetDefaultView(customerList);
view.Filter = obj =>
{
string item = obj as string;
return (item.ToLower().Contains(YourFilter));
};
我建议您阅读有关数据绑定的知识,以及它如何使用它来绑定列表框和文本框,并在视图模型中管理集合。
但要解决你的问题。
像customerList一样,在全局级别定义您的IcollectionView,并在主界面中将代码更改为
CollectionViewSource collectionViewSource = new CollectionViewSource();
collectionViewSource.Source = customerList;
collectionView = collectionViewSource.View;
collectionView.Filter = collectionFilter;
lbCustomers.ItemsSource = collectionView;
并添加这两种额外的方法
private bool collectionFilter(object obj)
{
if (string.IsNullOrWhiteSpace(txtSearch.Text))
return true;
string name = obj.ToString();
return name.Contains(txtSearch.Text);
}
private void TxtSearch_OnTextChanged(object sender, TextChangedEventArgs e)
{
collectionView.Refresh();
}
将文本框更改为
<TextBox x:Name="txtSearch" TextChanged="TxtSearch_OnTextChanged"/>
这些应该是不言自明的变化,但如果你需要任何帮助,我很乐意解释
过滤方法是定义过滤显示上的列表框项目的逻辑