我目前有27,000家公司的列表,这些公司都符合3个类别中的至少一个,Subcontractors
,Suppliers
和Planthire
。所有这些公司都加载到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
。如果同时选中Subcontractors
和Subcontractor
Supplier
,请显示符合CheckBoxes
和Companies
类别的Subcontractor
。这是我到目前为止所尝试的,但它没有实现这一点;
Supplier
如何修改此方法以使其达到我想要的效果?
答案 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) &&
...