Filtering an ObservableCollection?

后端 未结 3 1924
[愿得一人]
[愿得一人] 2020-12-06 01:51

When I bind a ListBox directly to an ObservableCollection I get the real-time updates displayed in my ListBox, but as soon as I add other LINQ methods in the mix my ListBox

相关标签:
3条回答
  • 2020-12-06 02:17

    You should use the ICollectionView.Filter property:

    ICollectionView view = CollectionViewSource.GetDefaultView(Words);
    view.Filter = WordFilter;
    
    ...
    
    
    bool WordFilter(object o)
    {
        string w = (string)o;
        return w.Contains(":")
    }
    
    0 讨论(0)
  • 2020-12-06 02:27

    Why it does not work:

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

    Your are not binding the ObservableCollection but the IEnumerable generated by Linq. This new "list" does not notify the ListBox about changes in the list.

    0 讨论(0)
  • 2020-12-06 02:31

    Try using the CollectionViewSource like this:

    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(":");
    }
    
    0 讨论(0)
提交回复
热议问题