XAML DataGrid筛选不会应用筛选器

时间:2011-09-20 15:39:26

标签: xaml datagrid observablecollection

我正在尝试创建一个包含两个标签的表单,每个标签都有一个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的其余代码非常方便。

有没有人看到这实际上有效,如果有,怎么样?

1 个答案:

答案 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是一个禁忌。 :)