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

如何对CollectionView进行多列筛选?

WPF ListView多列筛选实现

我有一个从数据库拉取大量数据的ListView,数据包含可用于筛选的字段,但目前只能单次按一列筛选,且两个筛选条件会互相覆盖。

初始单列筛选代码

以下是仅支持单列筛选的实现代码:

private bool prodAreaFilter(object item)
{
    return (item as PCdata).ProductionArea.IndexOf(((ComboBoxItem)prodAreaComboBox.SelectedItem).Content.ToString(), StringComparison.OrdinalIgnoreCase) >= 0;
}

private void prodArea_Combo_SelectionChanged(object sender, RoutedEventArgs e)
{
    CollectionView viewPA = (CollectionView)CollectionViewSource.GetDefaultView(lstView.ItemsSource);
    viewPA.Filter = prodAreaFilter;

    CollectionViewSource.GetDefaultView(lstView.ItemsSource).Refresh();

    //MessageBox.Show(((ComboBoxItem)prodAreaComboBox.SelectedItem).Content.ToString());

}

private bool typeFilter(object item)
{
    return (item as PCdata).Type.IndexOf(((ComboBoxItem)typeComboBox.SelectedItem).Content.ToString(), StringComparison.OrdinalIgnoreCase) >= 0;
}

private void type_Combo_SelectionChanged(object sender, RoutedEventArgs e)
{
    CollectionView viewType = (CollectionView)CollectionViewSource.GetDefaultView(lstView.ItemsSource);
    viewType.Filter = typeFilter;

    CollectionViewSource.GetDefaultView(lstView.ItemsSource).Refresh();

    //MessageBox.Show(((ComboBoxItem)typeComboBox.SelectedItem).Content.ToString());

}

首次尝试合并筛选逻辑

为解决筛选互相覆盖的问题,我尝试将两个筛选逻辑合并为单一方法,但该方法未处理ComboBox为空的场景:

private bool Filter(object item)
{
    return (item as PCdata).Type.IndexOf(((ComboBoxItem)typeComboBox.SelectedItem).Content.ToString(), StringComparison.OrdinalIgnoreCase) >= 0;
    (item as PCdata).ProductionArea.IndexOf(((ComboBoxItem)prodAreaComboBox.SelectedItem).Content.ToString(), StringComparison.OrdinalIgnoreCase) >= 0;
}


private void prodArea_Combo_SelectionChanged(object sender, RoutedEventArgs e)
{
    CollectionView viewPA = (CollectionView)CollectionViewSource.GetDefaultView(lstView.ItemsSource);
    viewPA.Filter = Filter;

    CollectionViewSource.GetDefaultView(lstView.ItemsSource).Refresh();

    //MessageBox.Show(((ComboBoxItem)prodAreaComboBox.SelectedItem).Content.ToString());

}

//private bool typeFilter(object item)
//{
//    return (item as PCdata).Type.IndexOf(((ComboBoxItem)typeComboBox.SelectedItem).Content.ToString(), StringComparison.OrdinalIgnoreCase) >= 0;
//}

private void type_Combo_SelectionChanged(object sender, RoutedEventArgs e)
{
    CollectionView viewType = (CollectionView)CollectionViewSource.GetDefaultView(lstView.ItemsSource);
    viewType.Filter = Filter;

    CollectionViewSource.GetDefaultView(lstView.ItemsSource).Refresh();

    //MessageBox.Show(((ComboBoxItem)typeComboBox.SelectedItem).Content.ToString());

}

最终解决方案(处理空筛选条件)

添加逻辑处理其中一个ComboBox为空的情况,最终实现多条件组合筛选:

private void prodArea_Combo_SelectionChanged(object sender, RoutedEventArgs e)
{
    if (string.IsNullOrEmpty(typeComboBox.Text)) //若另一个下拉框为空,仅使用当前下拉框的筛选条件
    {
        CollectionView viewPA = (CollectionView)CollectionViewSource.GetDefaultView(lstView.ItemsSource);
        viewPA.Filter = obj => ((PCdata)obj).ProductionArea.Contains(((ComboBoxItem)prodAreaComboBox.SelectedItem).Content.ToString());
    }
    else
    {
        CollectionView viewPA = (CollectionView)CollectionViewSource.GetDefaultView(lstView.ItemsSource);
        viewPA.Filter = obj => ((PCdata)obj).ProductionArea.Contains(((ComboBoxItem)prodAreaComboBox.SelectedItem).Content.ToString()) &&
                                ((PCdata)obj).Type.Contains(((ComboBoxItem)typeComboBox.SelectedItem).Content.ToString());
    }
    
    CollectionViewSource.GetDefaultView(lstView.ItemsSource).Refresh();
}

private void type_Combo_SelectionChanged(object sender, RoutedEventArgs e)
{
    if (string.IsNullOrEmpty(prodAreaComboBox.Text))
    {
        CollectionView viewPA = (CollectionView)CollectionViewSource.GetDefaultView(lstView.ItemsSource);
        viewPA.Filter = obj => ((PCdata)obj).Type.Contains(((ComboBoxItem)typeComboBox.SelectedItem).Content.ToString());
    }
    else
    {
        CollectionView viewPA = (CollectionView)CollectionViewSource.GetDefaultView(lstView.ItemsSource);
        viewPA.Filter = obj => ((PCdata)obj).ProductionArea.Contains(((ComboBoxItem)prodAreaComboBox.SelectedItem).Content.ToString()) &&
                                ((PCdata)obj).Type.Contains(((ComboBoxItem)typeComboBox.SelectedItem).Content.ToString());
    }
    
    CollectionViewSource.GetDefaultView(lstView.ItemsSource).Refresh();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 07:25:33