我正在尝试创建一个包含两个标签的表单,每个标签都有一个DataGrid,其上有不同的过滤器。我已经创建了过滤器:
ObservableCollection<ParcelVoucherDetails> _voucherDetails = new ObservableCollection<ParcelVoucherDetails>();
CollectionView cvFreightOut = new CollectionView(_voucherDetails);
cvFreightOut.Filter += FreightOutFilter;
dgFreightOut.ItemsSource = cvFreightOut;
CollectionView cvFreightIn = new CollectionView(_voucherDetails);
cvFreightIn.Filter += FreightInFilter;
dgFreightIn.ItemsSource = cvFreightIn;
然后我创建了过滤器:
public bool FreightOutFilter(object o)
{
ParcelVoucherDetails p = o as ParcelVoucherDetails;
if (p != null)
{
return (p.Type == "Freight Out");
}
return false;
}
public bool FreightInFilter(object o)
{
ParcelVoucherDetails p = o as ParcelVoucherDetails;
if (p != null)
{
return (p.Type == "Freight In");
}
return false;
}
现在,这就是令人讨厌的地方。在稍后的事件中,当我向ObservableCollection添加项目时,我可以看到过滤器按预期启动并接受或拒绝过滤器,但所有项目仍然出现在两个DataGrids上。
我尝试过使用CollectionViewSource,但这也行不通。我可以让任何过滤工作的唯一方法是跳过ObservableCollection并将DataTable与DataViews一起使用。我想在这里避免这种情况,因为使用ObservableCollection的其余代码非常方便。
有没有人看到这实际上有效,如果有,怎么样?
答案 0 :(得分:2)
我终于在墙上敲了敲头后发现了它。我现在觉得很荒谬,但我不得不分享解决方案:
ListCollectionView cvFO = new ListCollectionView(_voucherDetails);
cvFO.Filter += FreightOutFilter;
dgFreightOut.ItemsSource = cvFO;
ListCollectionView cvFI = new ListCollectionView(_voucherDetails);
cvFI.Filter += FreightInFilter;
dgFreightIn.ItemsSource = cvFI;
分别设置过滤器。显然,使用通用的CollectionView而不是ListCollectionView是一个禁忌。 :)