c# - 在多个复选框上过滤 ICollectionView

标签 c# wpf checkbox

我目前有 27,000 家公司的列表,这些公司都至少属于 3 个类别中的 1 个:分包商供应商Planthire。所有这些公司都加载到 ICollectionView 中,它是 DataGridItemsSource

我过去能够做的就是根据 Model 的一个属性过滤 ICollectionView。例如,如果我有一个作业列表,并且所有作业都附加了一个 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被选中,但其他的没有,则只显示Subcontractors。如果分包商供应商 CheckBoxes都被选中,则显示适合分包商公司 code> 和 供应商 类别。这是我到目前为止所尝试过的,但它没有实现这一目标;

private void FilterCompanyType(object sender, RoutedEventArgs e)
{
    var checkedCompanyFilters = new HashSet<string>();
    foreach (CheckBox checkBox in companyTypes.Children)
    {
        if (checkBox.IsChecked == true)
        {
            checkedCompanyFilters.Add((string)checkBox.Tag);
        }
    }

    if (subbieCheckBox.IsChecked == true)
    {
        CompanyICollectionView.Filter =
            company => checkedCompanyFilters.Contains((company as CompanyModel).Subcontractor.ToString());
    }

    if (supplierCheckBox.IsChecked == true)
    {
        CompanyICollectionView.Filter =
                company => checkedCompanyFilters.Contains((company as CompanyModel).Supplier.ToString());
    }

    if (planthireCheckBox.IsChecked == true)
    {
        CompanyICollectionView.Filter =
            company => checkedCompanyFilters.Contains((company as CompanyModel).Planthire.ToString());
    }          
}

如何修改此方法以实现我想要的效果?

最佳答案

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

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

关于c# - 在多个复选框上过滤 ICollectionView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34351437/

相关文章:

html - 如何修改 CSS 复选框标签以包含 'required' 函数

javascript - jquery 1.4.4 检查复选框如果检查每次都返回 true

c# - 如何将点数组转换为矩形

wpf - MVVM模式中的TypeInitializationException

javascript - jquery 中的复选框依赖关系

wpf - Application.Current.Shutdown() 没有

c# - 如何为我的 bool 属性正确实现 INotifyPropertyChanged 并绑定(bind)到 CheckBox.IsChecked?

c# - 系统类型.Collection <T>

c# - 在没有 Office 的情况下转换 Office 文档

c# - AWS SES 从版本 2 升级到版本 4?