我目前有 27,000 家公司的列表,这些公司都至少属于 3 个类别中的 1 个:分包商
、供应商
和 Planthire
。所有这些公司都加载到 ICollectionView
中,它是 DataGrid
的 ItemsSource
。
我过去能够做的就是根据 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/