繁体   English   中英

过滤列表视图 c# wpf

[英]Filtering a listview c# wpf

我正在使用此示例,并且仅在字符串成员上使用时效果很好,但是,我想在 class model 上使用它:

<Window x:Class="WpfTutorialSamples.ListView_control.FilteringSample"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="FilteringSample" Height="200" Width="300">
<DockPanel Margin="10">
    <TextBox DockPanel.Dock="Top" Margin="0,0,0,10" Name="txtFilter" TextChanged="txtFilter_TextChanged" />
    <ListView Name="lvUsers">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="Name" Width="120" DisplayMemberBinding="{Binding Name}" />
                <GridViewColumn Header="Age" Width="50" DisplayMemberBinding="{Binding Age}" />
            </GridView>
        </ListView.View>
    </ListView>
</DockPanel>
public partial class FilteringSample : Window
{
    public FilteringSample()
    {
        InitializeComponent();
        List<User> items = new List<User>();
        items.Add(new User() { Name = "John Doe", Age = 42 });
        items.Add(new User() { Name = "Jane Doe", Age = 39 });
        items.Add(new User() { Name = "Sammy Doe", Age = 13 });
        items.Add(new User() { Name = "Donna Doe", Age = 13 });
        lvUsers.ItemsSource = items;

        CollectionView view = (CollectionView)CollectionViewSource.GetDefaultView(lvUsers.ItemsSource);
        view.Filter = UserFilter;
    }

    private bool UserFilter(object item)
    {
        if(String.IsNullOrEmpty(txtFilter.Text))
            return true;
        else
            return ((item as User).Name.IndexOf(txtFilter.Text, StringComparison.OrdinalIgnoreCase) >= 0);
    }

    private void txtFilter_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)
    {
        CollectionViewSource.GetDefaultView(lvUsers.ItemsSource).Refresh();
    }
}

public enum SexType { Male, Female };

public class User
{
    public string Name { get; set; }

    public int Age { get; set; }

    public string Mail { get; set; }

    public SexType Sex { get; set; }
}

}

教程链接:

列表视图过滤

在此处输入图像描述

正如您在显示的图像上看到的,我想搜索姓名和年龄,而不仅仅是姓名,我如何过滤两个字段不同时?

您应该将 LvUsers ItemSource 属性绑定到 CollectionView,而不是用户列表。 此外,您必须在txtFilter_TextChanged方法中定义 CollectionView 的 Filter 方法,这样每当您更改文本时就会发生过滤。 像这样:

public partial class FilteringSample: Window {
      ListCollectionView Users {
        get;
        set;
      }
      public FilteringSample() {
        InitializeComponent();
        List < User > users = new List < User > {
          new User() {
            Name = "John Doe", Age = 42
          },
          new User() {
            Name = "Jane Doe", Age = 39
          },
          new User() {
            Name = "Sammy Doe", Age = 13
          },
          new User() {
            Name = "Donna Doe", Age = 13
          },
        };
        Users = (ListCollectionView) CollectionViewSource.GetDefaultView(users);
        lvUsers.ItemsSource = Users;
      }

      private void txtFilter_TextChanged(object sender, TextChangedEventArgs e) {
        Users.Filter = item => {
          User user = item as User;
          if (string.IsNullOrEmpty(txtFilter.Text))
            return true;
          else {
            string concat = $ "{user.Name} {user.Age}";
            return concat.ToLower().Contains(txtFilter.Text.ToLower());
          }
        };
      }
    }

正如您在txtFilter_TextChanged中看到的,我连接了 Name 和 Age 字段,这样您就可以按您喜欢的User object 的任何字段进行搜索。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM