在多个CheckBox上过滤ICollectionView

时间:2015-12-18 08:34:30

标签: c# wpf checkbox

我目前有27,000家公司的列表,这些公司都符合3个类别中的至少一个,SubcontractorsSuppliersPlanthire。所有这些公司都加载到ICollectionView,这是ItemsSource的{​​{1}}。

我之前能够做的是根据DataGrid的一个属性过滤ICollectionView。例如,如果我有一个工作列表,并且所有工作都附加了Model属性,我可以做这样的事情;

ITName

现在的问题

现在的问题是我正在尝试过滤private void OnCheckBoxCheck(object sender, RoutedEventArgs e) { var checkedEmployees = new HashSet<string>(); foreach (CheckBox checkBox in _employees.Children) { if (checkBox.IsChecked == true) { checkedEmployees.Add((string)checkBox.Content); checkedEmployees.Add((string)checkBox.Tag); } } JobsCollectionView.Filter = job => checkedEmployees.Contains((job as JobModel).ITName); } 的多个属性。从中取出不相关的部分,它看起来像这样;

CompanyModel

我想要做的是检查public class CompanyModel { public int Subcontractor { get; set; } public int Supplier { get; set; } public int Planthire { get; set; } } Subcontractor但其他人不是,只显示CheckBox。如果同时选中SubcontractorsSubcontractor Supplier,请显示符合CheckBoxesCompanies类别的Subcontractor。这是我到目前为止所尝试的,但它没有实现这一点;

Supplier

如何修改此方法以使其达到我想要的效果?

2 个答案:

答案 0 :(得分:1)

您的公司模型应更改为使用enum作为公司类型,使用单int作为密钥。应使用enum属性声明[Flags],以便它可用于布尔运算。然后你的过滤器看起来像这样:

CompanyICollectionView.Filter =
    company => checkedCompanyFilters.Where(
        ((company as CompanyModel).CompanyType & CompanyTypes.Whatever) 
            == CompanyTypes.Whatever).Key.ToString();

答案 1 :(得分:1)

您可以组合多个过滤条件:

var isSubbie = subbieCheckBox.IsChecked == true;
var isSupplier = supplierCheckBox.IsChecked == true;
...

CompanyICollectionView.Filter = company =>
{
    var model = (CompanyModel)company;
    return isSubbie && checkedCompanyFilters.Contains(model.Subcontractor.ToString()) ||
        isSupplier && checkedCompanyFilters.Contains(model.Supplier.ToString()) ||
        ...
};

我认为checkedCompanyFilters是一组不同的分包商,但看起来你只想过滤一个。然后只需将上面的返回行更改为这样的内容(我不确定您如何定义 company is subcontractor ,是Subcontractor > 0时的那个?):

    return isSubbie && model.Subcontractor > 0 ||
        isSupplier && model.Supplier > 0 ||
        ...
  

如果Subcontractors

,我仍然希望Suppliers也是model.Subcontractor > 0 && model.Suppliers > 0,即isSubbie && isSupplier

然后只需将return替换为:

    return (isSubbie ? model.Subcontractor > 0 : model.Subcontractor == 0) &&
        (isSupplier ? model.Supplier > 0 : model.Supplier == 0) &&
        ...

或:

    return (isSubbie && model.Subcontractor > 0 || !isSubbie && model.Subcontractor == 0) &&
        (isSupplier && model.Supplier > 0 || !isSupplier && model.Supplier == 0) &&
        ...