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 is no longer notified of any changes to the ObservableCollection.
Here, let me illustrate with an example;
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());
}
}
Here I've added a Button and a ListBox to a simple Page, and clicking the button makes the new item appear immediately in the ListBox.
However, if I change from
listBox1.ItemsSource = Words;
to
listBox1.ItemsSource = Words.Where(w => w.Contains(":"));
the ListBox is no longer updated.
How can I add a "filter" between my ObservableCollection and the ListBox, and still get it to update without having to set the .ItemsSource again?
Why it does not work:
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.
You should use the
ICollectionView.Filter
property:Try using the CollectionViewSource like this: