0

我有一个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;
};

但他们都没有工作。

您能否提供一些建议如何在 a 上重置过滤器CollectionView

4

2 回答 2

4

从您的示例中,我不完全确定您是如何获得 CollectionView 的,也不确定我是否正确理解了您的问题。

但无论如何,我希望下面的示例代码可以帮助您解决问题。这是一个应用程序,它有一个包含字符串的列表框和一个“过滤器”文本框。如果列表中没有任何内容与过滤器匹配,则过滤器将设置为 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>

代码隐藏:

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;
    }
}
于 2010-08-19T15:06:54.653 回答
1

我犯了一个很大的装订错误。我完全不明白它是如何工作的。

所以问题是,重置过滤器很简单,只需将值设置为null。

还有一件事。我尝试像您那样创建 ListCollectionView。

this.lcv = new ListCollectionView(s);

但是过滤器不起作用,我无法将 SortDescription 添加到 CollectionView。

我以这种方式创建 CollectionView:

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

一切正常。但理想情况下,您的技术也必须发挥作用。

于 2010-08-19T18:48:15.537 回答