You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不使用MVVM模式下通过CollectionView实现GridView多条件筛选?

多条件GridView筛选实现方案

核心思路

你只需要在ListCollectionView的Filter委托里,把所有控件的筛选条件用逻辑与(&&)拼接起来即可,同时增加空白判断,对应控件未输入内容时不限制该字段的筛选条件。

具体实现步骤

  • 第一步:给所有需要参与筛选的控件(TextBox、ComboBox)的文本变更/选择变更事件绑定同一个刷新筛选的方法
  • 第二步:在筛选委托中依次判断每个控件的输入值,拼接所有生效的条件
  • 第三步:每次条件变更时调用view.Refresh()刷新视图即可,不需要重复给GridView指定ItemsSource

完整示例代码

// 你的数据源,假设是全局的List<User>
List<User> MyList = new List<User>();
ListCollectionView view;

// 窗口初始化时绑定一次视图即可
private void Window_Loaded(object sender, RoutedEventArgs e)
{
    // 模拟初始化数据源,可替换为你自己的数据源加载逻辑
    MyList.Add(new User { Id = 1, Name = "张三", Age = 25, Department = "技术部" });
    MyList.Add(new User { Id = 2, Name = "李四", Age = 30, Department = "人事部" });
    MyList.Add(new User { Id = 3, Name = "王五", Age = 25, Department = "技术部" });

    // 只需要初始化一次ListCollectionView即可
    view = (ListCollectionView)CollectionViewSource.GetDefaultView(MyList);
    GridView.ItemsSource = view;

    // 给所有筛选控件绑定同一个筛选刷新方法,可按实际控件数量扩展
    Name_txt.TextChanged += RefreshFilter;
    Age_cmb.SelectionChanged += RefreshFilter;
    Department_cmb.SelectionChanged += RefreshFilter;
}

// 统一的筛选刷新方法
private void RefreshFilter(object sender, RoutedEventArgs e)
{
    view.Filter = delegate (object item)
    {
        User user = item as User;
        if (user == null) return false;

        // 1. 姓名筛选:文本框为空时该条件自动满足,不参与过滤
        bool nameMatch = string.IsNullOrEmpty(Name_txt.Text) 
                        || user.Name.Contains(Name_txt.Text);
        
        // 2. 年龄筛选:下拉框未选择时该条件自动满足,不参与过滤
        bool ageMatch = Age_cmb.SelectedItem == null 
                        || user.Age == (int)Age_cmb.SelectedValue;
        
        // 3. 部门筛选:下拉框未选择时该条件自动满足,不参与过滤
        bool deptMatch = Department_cmb.SelectedItem == null 
                        || user.Department == Department_cmb.SelectedValue.ToString();

        // 所有生效条件都满足才会展示对应数据,若需要逻辑或筛选可把&&改为||
        return nameMatch && ageMatch && deptMatch;
    };

    // 刷新视图应用最新筛选规则
    view.Refresh();
}

// 你的User类补全示例,可按实际业务字段扩展
public class User 
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
    public string Department { get; set; }
} 

注意事项

  • 示例中的控件名(Age_cmb、Department_cmb)请替换为你实际项目中对应的控件名称
  • 如果需要模糊匹配下拉框选项的内容,可将等于判断修改为Contains匹配逻辑

内容的提问来源于stack exchange,提问作者abdou93

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 14:45:04