2010-08-19 4 views
0

У меня есть CollectionView, полученный из ObservableCollection:WPF ICollectionView фильтр Сбросить

private static ObservableCollection<CalculationViewModel> _calculations; 

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

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

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

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

и

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

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

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

ответ

3

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

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

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> 

Code-за:

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

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

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

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

this.lcv = new ListCollectionView(s); 

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

Я создаю CollectionView так:

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

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

+0

Hi. Я вижу, что вы ответили. Вы должны были использовать «Добавить комментарий» вместо кнопки «Добавить другой ответ», чтобы я получил уведомление. В любом случае, я предполагаю, что ваш ItemsSource установлен равным переменной «s» вместо «lcv», правильно? Если вы собираетесь использовать мой подход, вам нужно будет установить значение ItemsSource равным «lcv». Это должно заставить его работать. – ASanch

+0

Привет! Спасибо за совет, я просто использую stackoverflow два дня назад, и для меня это немного странно. :) Да, я должен установить ItemsSource равным CollectionView, а не коллекции. Спасибо, Zoli –

+0

Это нормально.Кстати, если вы думаете, что я ответил на ваш вопрос по моему первоначальному ответу выше, пожалуйста, примите мой ответ, нажав галочку. Благодарю. – ASanch

Смежные вопросы