2015-05-04 75 views
1

我将WPF应用程序与搜索文本框和Listview绑定到ICollectionView。我可以基于texbox值过滤ICollectionView,但是我有兴趣通过传递多个由逗号分隔的值并将多个Filtering应用于集合来扩展功能。根据多个条件筛选CollectionView

var filterStrings= TextBoxValue.Split(','); 

MyCollectionView.Filter = m => 
    (((MyObject)m).myProperty.ToLower().ContainsAll(filterStrings) 

其中ContainsAll是扩展

public static bool ContainsAll(this string source, params string[] values) 
{ 
     return values.All(x => source.Contains(x)); 
} 

的过滤器不包含多个结果,任何想法,为什么?谢谢

编辑

,收藏的简单的字符串值(鲍勃斌,灰色,翅,奇,壳牌),我想例如提供一个过滤器(B,F)和具有上述值(鲍勃斌,散热片,奇)

+2

您能否介绍一个示例场景(列表中的项目是什么,您的过滤标准和预期结果是什么)?现在很难理解这个问题。作为第一个猜测,我会说你应该使用'Any'而不是'All'。 –

+0

@MM:sry我没有看到你的答案*(避免回答评论中的问题) – sac1

+0

@MártonMolnár是完全正确的,它的工作正常。我不能接受它,因为它不是一个答案:( – Jim

回答

2

在这种情况下.All的结果意味着:它包含B和F太(和条件)

但你需要.Any (或条件)

public static bool ContainsAll(this string source, params string[] values) 
{ 
    return values.Any(x => source.Contains(x)); 
} 
1

我不知道它是最佳的,但它的工作原理:

string[] collection = new string[] {"Bob", "Bin", "Grey", "Fin", "Fantastic", "Shell" }; 
string filter = "B,F"; // TextBoxValue 
string[] filterStrings = filter.Split(','); 
string results = string.Join(",", collection.Where(c => filterStrings.Any(f => c.Contains(f)))); 

你可以把它调整到您的需要。