筛选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; }
}

筛选xaml列表框

尝试获取集合的默认集合视图。每次您的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"/>

这些应该是不言自明的变化,但如果你需要任何帮助,我很乐意解释

过滤方法是定义过滤显示上的列表框项目的逻辑