tldr:CollectionViewSource.Filter 被另一个控件覆盖。我怎样才能有两层过滤,以便控件只能看到预过滤的集合?
我有一个第三方网格控件,我通过 ICollectionView 绑定到我的视图模型中的集合。
private CollectionViewSource _filteredCollection;
public ItemListViewModel (List<ItemViewModel> items)
{
_items = items;
_filteredCollection = new CollectionViewSource {Source = _items};
}
public ICollectionView AllInstructions
{
get { return _filteredCollection.View; }
}
这可以正常工作,并允许 gridcontrol 进行自己的过滤、分组和排序。现在我想在网格之前应用我自己的过滤器(即一个只显示今天的项目的按钮)
public ItemListViewModel (List<ItemViewModel> items)
{
...
_filteredCollection.Filter += new FilterEventHandler(FilterByDate);
}
private void FilterByDate(object sender, FilterEventArgs e)
{
var item = e.Item as ItemViewModel;
if (item == null)
{
e.Accepted = false;
}
else
{
e.Accepted = item.CreatedDate >= _selectedDate;
}
}
我的新过滤器按预期工作。问题是,gridcontrol 不能很好地使用它,它只会用它自己的过滤器覆盖任何过滤器。
我的想法是在 _filteredCollection CVS 上执行过滤,然后围绕它创建另一个 CollectionViewSource 或 CollectionView,然后传递给 gridcontrol。
如果我将 _filteredCollection 包装在 ICollectionView 中,则两层过滤工作完美,但我无法排序或分组,因为 ICollectionView 的默认构造函数将 CanSort 和 CanGroup 设置为 false。
我想不通的是如何将 _filteredCollection 输入到第二个 CollectionViewSource 的构造函数中。有可能还是我从错误的角度解决了这个问题?