如何对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
相关产品推荐
相关产品推荐

