gpt4 book ai didi

.net - CollectionViewSources 是可嵌套的吗?

转载 作者:行者123 更新时间:2023-12-03 10:14:11 26 4
gpt4 key购买 nike

tldr:CollectionViewSource.Filter 被另一个控件覆盖。我怎样才能有两层过滤,以便控件只能看到预过滤的集合?

我有一个第三方网格控件,我通过 ICollectionView 绑定(bind)到我的 View 模型中的集合。

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 的构造函数中。有可能还是我从错误的角度解决了这个问题?

最佳答案

您可以通过从 ListCollectionView 派生来使用预定义的过滤器创建自己的 Collection View 。 ,就像下面的代码:

class FilteredListCollectionView : ListCollectionView
{
// internal filter
private Predicate<object> preFilter;

// public filter
private Predicate<object> filter;

public FilteredListCollectionView(IList list)
: base(list)
{
}

private Predicate<object> GetCombinedFilter()
{
if (this.preFilter != null)
return this.filter != null ? x => this.preFilter(x) && this.filter(x) : this.preFilter;
else
return this.filter;
}

public Predicate<object> PreFilter
{
get { return this.preFilter; }
set
{
this.preFilter = value;
base.Filter = this.GetCombinedFilter();
}
}

public override Predicate<object> Filter
{
get { return base.Filter; }
set
{
this.filter = value;
base.Filter = this.GetCombinedFilter();
}
}
}

现在你可以像这样使用它:
private FilteredListCollectionView _filteredCollection;

public ItemListViewModel(List<ItemViewModel> items)
{
_items = items;
_filteredCollection = new FilteredListCollectionView(_items);
_filteredCollection.PreFilter = FilterByDate;
}

public ICollectionView AllInstructions
{
get { return _filteredCollection; }
}

private bool FilterByDate(object obj)
{
var item = obj as ItemViewModel;

if (item == null)
{
return false;
}
else
{
return item.CreatedDate >= _selectedDate;
}
}

我没有用任何控制测试过这个,但我认为它应该可以工作。

关于.net - CollectionViewSources 是可嵌套的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17569832/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com