Фильтрация ICollectionView, привязанного к ItemsControl - PullRequest
0 голосов
/ 14 апреля 2020

Я хочу сделать приложение WPF для просмотра рецептов блюд. Возникли проблемы с фильтрацией данных.

Я использую ItemsControl, чтобы мои данные выглядели как «плитки» в окне. Теперь я хочу отфильтровать его с помощью TextBox, но не могу понять, что не так.

Вот моя привязка XAML:

<ItemsControl ItemsSource="{Binding}" Height="573">

Текстовое поле:

<TextBox x:Name="Szukaj" Text="{Binding Szukane, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" Height="27.667" Margin="18.667,145,0,0" IsEnabled="True" TextWrapping="Wrap" VerticalAlignment="Top" Width="197.333" FontSize="14" />

C# код с фильтрацией

public ObservableCollection<Przepis> lista {get; set; }

public ICollectionView ItemsView
{
    get { return CollectionViewSource.GetDefaultView(lista); }
}

public Page1(ObservableCollection<Przepis> l)
{
    InitializeComponent();
    lista = l;

    ItemsView.Filter = new Predicate<object>(o => Filter(o as Przepis));
    this.DataContext = ItemsView;
}

private bool Filter(Przepis p)
{
    return Szukane == null
        || p.NazwaPrzepisu.IndexOf(Szukane, StringComparison.OrdinalIgnoreCase) != -1
        || p.RodzajDiety.IndexOf(Szukane, StringComparison.OrdinalIgnoreCase) != -1
        || p.RodzajPosilku.IndexOf(Szukane, StringComparison.OrdinalIgnoreCase) != -1;
}

private string szukane;

public string Szukane
{
    get { return szukane; }
    set
    {
        szukane = value;
        NotifyPropertyChanged("Szukane");
        ItemsView.Refresh();

    }
}

1 Ответ

0 голосов
/ 14 апреля 2020

this.DataContext = ItemsView; - с такой привязкой DataContext Text="{Binding Szukane}" не может работать, поскольку Szukane не является свойством ItemsView. вам нужно изменить источник привязки:

Text="{Binding Szukane, RelativeSource={RelativeSource AncestorType=Page} UpdateSourceTrigger=PropertyChanged}"

В качестве альтернативы создайте модель представления, содержащую свойства ItemsView и Szukane, и используйте ее для DataContext.

Я также Рекомендуется добавить задержку для привязки текста, чтобы уменьшить объем фильтрации при наборе:

Text="{Binding Szukane, Daley=250, RelativeSource=...}

...