gpt4 book ai didi

WPF 在同一个 ListCollectionView 上使用多个过滤器

转载 作者:行者123 更新时间:2023-12-04 00:05:41 26 4
gpt4 key购买 nike

我正在使用 MVVM 设计模式,ListView 绑定(bind)到 ViewModel 上的 ListCollectionView。我还有几个用于过滤 ListView 的组合框。当用户从组合框中选择一个项目时,ListView 将针对所选项目进行筛选。每当我想在已过滤的内容之上进行过滤时,它都会撤消我以前的过滤器,就像它从未发生过一样。移除过滤器也是如此。删除一个组合框的过滤器会删除所有过滤器并显示原始列表。是否可以在同一个 ListCollectionView 上有多个单独的过滤器?

我做错了什么,还是根本不支持?您可以找到我的应用程序的屏幕截图 here看看我想要完成什么。这是我的过滤代码...

    /// <summary>
/// Filter the list
/// </summary>
/// <param name="filter">Criteria and Item to filter the list</param>
[MediatorMessageSink("FilterList", ParameterType = typeof(FilterItem))]
public void FilterList(FilterItem filter)
{
// Make sure the list can be filtered...
if (Products.CanFilter)
{
// Now filter the list
Products.Filter = delegate(object obj)
{
Product product = obj as Product;

// Make sure there is an object
if (product != null)
{
bool isFiltered = false;
switch (filter.FilterItemName)
{
case "Category":
isFiltered = (product.Category.IndexOf(filter.Criteria, StringComparison.CurrentCultureIgnoreCase)) != -1 ? true : false;
break;

case "ClothingType":
isFiltered = (product.ClothingType.IndexOf(filter.Criteria, StringComparison.CurrentCultureIgnoreCase)) != -1 ? true : false;
break;

case "ProductName":
isFiltered = (product.ProductName.IndexOf(filter.Criteria, StringComparison.CurrentCultureIgnoreCase)) != -1 ? true : false;
break;

default:
break;
}

return isFiltered;
}
else
return false;
};
}
}

最佳答案

每次设置过滤器属性时,都会重置以前的过滤器。这是事实。现在你怎么能有多个过滤器?
如您所知,有两种过滤方式:CollectionViewCollectionViewSource .在第一种情况下 CollectionView我们使用委托(delegate)进行过滤,并且要执行多个过滤器,我会创建一个类来聚合自定义过滤器,然后为每个过滤器项一个一个地调用它们。就像在下面的代码中一样:

  public class GroupFilter
{
private List<Predicate<object>> _filters;

public Predicate<object> Filter {get; private set;}

public GroupFilter()
{
_filters = new List<Predicate<object>>();
Filter = InternalFilter;
}

private bool InternalFilter(object o)
{
foreach(var filter in _filters)
{
if (!filter(o))
{
return false;
}
}

return true;
}

public void AddFilter(Predicate<object> filter)
{
_filters.Add(filter);
}

public void RemoveFilter(Predicate<object> filter)
{
if (_filters.Contains(filter))
{
_filters.Remove(filter);
}
}
}

// Somewhere later:
GroupFilter gf = new GroupFilter();
gf.AddFilter(filter1);
listCollectionView.Filter = gf.Filter;
要刷新过滤 View ,您可以调用 ListCollectionView.Refresh()方法。
在第二种情况下, CollectionViewSource您使用 Filter过滤集合的事件。您可以创建多个事件处理程序以按不同条件进行过滤。要了解有关此方法的更多信息,请查看 Bea Stollnitz 的这篇精彩文章: How do I apply more than one filter? ( archive)
希望这可以帮助。
干杯,安瓦卡。

关于WPF 在同一个 ListCollectionView 上使用多个过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1934935/

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