Фильтровать CollectionViewSource по строке поиска - привязано к itemscontrol (WPF MVVM) - PullRequest
0 голосов
/ 24 октября 2018

Есть ли способ, которым я могу отфильтровать CollectionViewSource, чтобы показывать только игры в ItemsSource, "Title" которого содержит "searchString"?

В моем PosterView у меня есть этот CVS:

    <CollectionViewSource x:Key="GameListCVS"
                          Source="{Binding PosterView}"
                          Filter="GameSearchFilter">
        <CollectionViewSource.SortDescriptions>
            <scm:SortDescription PropertyName="Title" />
        </CollectionViewSource.SortDescriptions>
    </CollectionViewSource>

, а также этот ItemsControl

    <ItemsControl x:Name="gameListView"
                      ItemsSource="{Binding Source={StaticResource GameListCVS}}">

My MainWindow.xaml содержит окно поиска, которое может успешно передать searchString (строку, содержащуюся в окне поиска) в PosterView.

Привязка PosterViewна самом деле (смущает, я знаю) коллекция ObservableCollection

 public ObservableCollection<GameList> PosterView { get; set; }

А вот как игры добавляются в коллекцию Observable

                    games.Add(new GameList
                {
                    Title = columns[0],
                    Genre = columns[1],
                    Path = columns[2],
                    Link = columns[3],
                    Icon = columns[4],
                    Poster = columns[5],
                    Banner = columns[6],
                    Guid = columns[7]
                });

1 Ответ

0 голосов
/ 24 октября 2018

Если вы создаете CollectionViewSource в представлении, вам также следует отфильтровать его:

private void GameSearchFilter(object sender, FilterEventArgs e)
{
    GameList game = e.Item as GameList;
    e.Accepted = game != null && game.Title?.Contains(txtSearchString.Text);
}

Другой вариант - привязать к ICollectionView и отфильтровать его вмодель представления:

_view = CollectionViewSource.GetDefaultView(sourceCollection);
_view.Filter = (obj) => 
{
    GameList game = obj as GameList;
    return game != null && game.Title?.Contains(_searchString);
};
...
public string SearchString
{
    ...
    set { _searchString = value; _view.Refresh(); }
}

Или непосредственно отсортируйте исходную коллекцию.

...