Filtering an ObservableCollection?

本文关键字:ObservableCollection an Filtering | 更新日期: 2023-09-27 17:53:25

当我直接绑定一个ListBox到一个ObservableCollection,我得到实时更新显示在我的ListBox,但一旦我添加其他LINQ方法在混合我的ListBox不再通知任何变化到ObservableCollection

这里,让我用一个例子来说明;

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());
    }
}

这里我已经添加了一个按钮和一个列表框到一个简单的页面,点击按钮使新的项目立即出现在列表框。

但是,如果我从
        listBox1.ItemsSource = Words;

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

列表框不再更新。

我如何在我的ObservableCollection和ListBox之间添加一个"过滤器",并且仍然让它更新而不必再次设置。itemssource ?

Filtering an ObservableCollection?

尝试像这样使用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(":");
}

为什么不工作:

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

你绑定的不是ObservableCollection,而是Linq生成的IEnumerable。这个新的"list"不会通知ListBox列表的变化

您应该使用ICollectionView.Filter属性:

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

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