在UI上过滤ObservableCollection项目?

时间:2016-09-12 12:28:37

标签: c# wpf xaml

我制作了一个应用程序,可以从互联网上安排一些事件,此事件被插入ListView内,此列表以GroupDescription组织内容,如下所示:

<CollectionViewSource Source="{Binding Matches}" x:Key="GroupedItems">
        <CollectionViewSource.GroupDescriptions>
            <PropertyGroupDescription PropertyName="MatchNation" />
            <PropertyGroupDescription PropertyName="MatchLeague" />
        </CollectionViewSource.GroupDescriptions>
</CollectionViewSource>

现在,我使用了TextBox,其中使用可以搜索Matches集合中的特定项目,我想要实现的是使用给定的{过滤集合用户在search

中提供的{1}}字符串

我现在所做的是使用TextBox的机制,创建集合的备份并删除所有不适合用户linq字符串的项目,但我注意到了这段代码太重了,而且代码太多,无法实现简单的UI过滤。

我想知道是否有可能创建像xaml这样的东西。所以基本上我在xaml中绑定了一个获取search提供的搜索字符串的属性,当值发生变化时,TextBox集合将被搜索到的文本过滤掉,所有这些通过xaml。

这可能吗?

示例

Matches中的项目:

  • 你好
  • 世界

用户搜索Matches =&gt;你好:

TextBox中的

将仅显示ListView

1 个答案:

答案 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需要绑定到集合视图源以利用该对象内置的过滤。否则,如果列表视图仍然绑定到实际集合,则不会对其进行过滤。您可以将视图源视图模型中的属性或视图后面的代码。