WPF: Bind / Apply Filter для логического свойства - PullRequest
1 голос
/ 22 апреля 2010

Я хочу применить фильтр к ListBox соответственно свойству IsSelected CheckBox.

На данный момент у меня есть что-то вроде этого.
1008 * XAML *

<CheckBox Name="_filterCheckBox" Content="Filter list" Checked="ApplyFilterHandler"/>
<ListBox ItemsSource="{Binding SomeItems}" />

CodeBehind

    public ObservableCollection<string> SomeItems { get; private set; }

    private void ApplyFilterHandler(object sender, RoutedEventArgs e)
    {
        if (_filterCheckBox.IsChecked.Value)
            CollectionViewSource.GetDefaultView(SomeItems).Filter += MyFilter;
        else
            CollectionViewSource.GetDefaultView(SomeItems).Filter -= MyFilter;
    }

    private bool MyFilter(object obj)
    {
        return ...
    }

Это работает, но это решение похоже на старомодный способ (Windows Forms).

Вопрос:
Можно ли добиться этого с помощью Bindings / в XAML?

Спасибо за ваше время.

1 Ответ

0 голосов
/ 22 апреля 2010

Единственный способ, которым я могу придумать, - это создать ObjectDataProvider и два отдельных CollectionViewSource объекта в XAML. В одном представлении будет применен фильтр, в другом - нет. Затем вы можете привязать непосредственно к свойству CheckBox.IsChecked и использовать пользовательский IValueConverter. Преобразователь значений будет иметь 2 свойства зависимостей - оба типа CollectionViewSource.. Эти свойства могут называться " UnfilteredItems " и " FilteredItems ". В XAML вы должны установить свойство нефильтрованных элементов равным CollectionViewSource, которое было нефильтрованным, а свойство отфильтрованных элементов равным значению с фильтром. Сама логика преобразователя была бы простой - если true, вернуть отфильтрованный CollectionViewSource, если false, вернуть нефильтрованный.

Это решение не очень элегантно, но оно выполнит свою работу. Поскольку Filter не является DependencyProperty и может быть задан только обработчиком событий, наши руки как бы связаны с этим. Я не думаю, что ваше решение плохое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...