过滤ObservableCollection?

时间:2011-04-25 19:55:05

标签: c# linq xaml windows-phone-7 observablecollection

当我将ListBox直接绑定到ObservableCollection时,我得到了ListBox中显示的实时更新,但是只要我在混合中添加其他LINQ方法,我的ListBox就不会再通知ObservableCollection的任何更改。 / p>

在这里,让我举例说明一下;

public partial class MainPage : PhoneApplicationPage
{
    ObservableCollection<String> Words = new ObservableCollection<string>();

    public MainPage()
    {
        InitializeComponent();
        listBox1.ItemsSource = Words;
    }

    private void AddButton_Click(object sender, RoutedEventArgs e)
    {
        Words.Add(DateTime.Now.ToString());
    }
}

这里我向一个简单的页面添加了一个Button和一个ListBox,点击该按钮使新项目立即显示在ListBox中。

但是,如果我从

改变
        listBox1.ItemsSource = Words;

        listBox1.ItemsSource = Words.Where(w => w.Contains(":"));

ListBox不再更新。

如何在我的ObservableCollection和ListBox之间添加“过滤器”,并且仍然可以在不必再次设置.ItemsSource的情况下进行更新?

3 个答案:

答案 0 :(得分:19)

尝试使用CollectionViewSource:

WordsView = new CollectionViewSource();
WordsView.Filter += Words_Filter;
WordsView.Source = Words;

// ...
void Words_Filter(object sender, FilterEventArgs e)
{
    if (e.Item != null)
        e.Accepted = ((string)e.Item).Contains(":");
}

答案 1 :(得分:6)

为什么它不起作用:

listBox1.ItemsSource = Words.Where(w => w.Contains(":"));

你没有绑定ObservableCollection,而是绑定了Linq生成的IEnumerable。这个新的“列表”不会通知ListBox有关列表中的更改。

答案 2 :(得分:3)

您应该使用ICollectionView.Filter属性:

ICollectionView view = CollectionViewSource.GetDefaultView(Words);
view.Filter = WordFilter;

...


bool WordFilter(object o)
{
    string w = (string)o;
    return w.Contains(":")
}
相关问题