Сброс фильтра WPF ICollectionView - PullRequest
0 голосов
/ 19 августа 2010

У меня есть CollectionView, полученное из ObservableCollection:

private static ObservableCollection<CalculationViewModel> _calculations;

CalculationViewModelsCollection = (CollectionView)CollectionViewSource.GetDefaultView(_calculations);

Моя проблема в том, что, когда результат фильтра - ничто, я хотел бы очистить фильтр и повторно фильтровать его с другими условиями, но CollectionView всегда пуст.

Я попытался сбросить фильтр следующими способами:

CalculationViewModelsCollection.Filter = null;
CalculationViewModelsCollection.Refresh();

и

CalculationViewModelsCollection.Filter = delegate(object p)
{
    return true;
};

Но ни один из них не работал.

Не могли бы вы дать несколько советов, как сбросить фильтр на CollectionView?

Ответы [ 2 ]

3 голосов
/ 19 августа 2010

Из вашего примера я не совсем уверен, как вы получаете ваш CollectionView, и не уверен, что правильно понял ваш вопрос.

Но в любом случае, я надеюсь, что приведенный ниже пример кода поможет вам в вашей проблеме.Это приложение, которое имеет список, содержащий строки, и текстовое поле «фильтр».если ничто в списке не соответствует фильтру, фильтр будет установлен в нуль и, таким образом, будет отображать все элементы.

XAML:

<Window x:Class="WpfApplication3.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:v="clr-namespace:WpfApplication3"
        Title="MainWindow" Height="350" Width="525">
    <StackPanel>
        <TextBox x:Name="textBox" TextChanged="TextBox_TextChanged"/>        
        <ListBox x:Name="listBox"/>
    </StackPanel>
</Window>

Кодовый код:

public partial class MainWindow : Window
{
    ListCollectionView lcv;
    Predicate<object> filterFx;

    public MainWindow()
    {
        InitializeComponent();

        ObservableCollection<string> s = new ObservableCollection<string>();
        "The Quick Brown Fox Jumps Over The Lazy Dog"
            .Split(' ')
            .ToList()
            .ForEach((word) => s.Add(word.ToString()));

        this.lcv = new ListCollectionView(s);
        this.listBox.ItemsSource = this.lcv;

        this.filterFx = (p) => ((string)p).ToUpper().Contains(this.textBox.Text.ToUpper());
        lcv.Filter = this.filterFx;
    }

    private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
    {
        lcv.Refresh();

        if (lcv.Count == 0)
            lcv.Filter = null;
        else
            lcv.Filter = filterFx;
    }
}
1 голос
/ 19 августа 2010

Я сделал большую ошибку связывания.Я вообще не понимаю, как это работает.

Так что дело в том, что просто сбросить фильтр, просто установить значение в ноль.

Есть еще одна вещь.Я попытался создать ListCollectionView, как вы это сделали.

this.lcv = new ListCollectionView(s);

Но фильтр не сработал, и я не смог добавить SortDescription в CollectionView.

Я создаю CollectionView следующим образом:

this.lcv = (CollectionView)CollectionViewSource.GetDefaultView(s);

и все работает нормально.Но в идеале ваша техника тоже должна работать.

...