我制作了一个应用程序,可以从互联网上安排一些事件,此事件被插入ListView
内,此列表以GroupDescription
组织内容,如下所示:
<CollectionViewSource Source="{Binding Matches}" x:Key="GroupedItems">
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="MatchNation" />
<PropertyGroupDescription PropertyName="MatchLeague" />
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
现在,我使用了TextBox
,其中使用可以搜索Matches
集合中的特定项目,我想要实现的是使用给定的{过滤集合用户在search
。
我现在所做的是使用TextBox
的机制,创建集合的备份并删除所有不适合用户linq
字符串的项目,但我注意到了这段代码太重了,而且代码太多,无法实现简单的UI过滤。
我想知道是否有可能创建像xaml这样的东西。所以基本上我在xaml中绑定了一个获取search
提供的搜索字符串的属性,当值发生变化时,TextBox
集合将被搜索到的文本过滤掉,所有这些通过xaml。
这可能吗?
示例
Matches
中的项目:
用户搜索Matches
=&gt;你好:
TextBox
中的将仅显示ListView
。
答案 0 :(得分:0)
有了性能,您可能需要尝试一些事情,只需测量实际结果即可找到最佳答案。但是,我认为在CollectionViewSource上使用Filter
回调很有意义。基本上,您只需将Filter
属性分配给回调,该回调接受来自源的项目并返回bool
以告知是否应显示该项。这是一个例子:
// Create a view of your data, the listview should be bound to this too
ICollectionView _matchesView = CollectionViewSource.GetDefaultView(Matches);
// assign the Filter callback to setup filtering
_matchesView.Filter = FilterMatches;
// write the callback method, which returns true for items to display and false for items to hide
private bool MatchFilter(object item)
{
// you can put any logic you need in here
var match = item as string;
return match.Contains(_searchQuery);
}
如果源集合或搜索查询发生更改,则您还需要更新集合视图源。例如,如果您有一个FilterString
属性,该属性绑定到用户输入搜索词的位置,您可以在setter中执行类似的操作。关键是你需要在发生变化时调用Refresh()
。
public string FilterString
{
get { return _filterString; }
set
{
_filterString = value;
NotifyPropertyChanged(nameof(FilterString));
_matchesView.Refresh();
}
}
主要变化是您的ListView
需要绑定到集合视图源以利用该对象内置的过滤。否则,如果列表视图仍然绑定到实际集合,则不会对其进行过滤。您可以将视图源视图模型中的属性或视图后面的代码。