I took an example for a TreeView where you filter items with a Boolean "IsRemovedByFilter". The example had the items re-created with a copy constructor.
I did the same on a tree list view, and replaced the copy constructor with ListCollectionView.EditItem and CommitEdit.
The more times you filter the items, the slower it gets.
Here is the code:
The data context is being set by (just a quick and dirty way for this example):
this.DataContext = new MainViewModel();
The ViewModels are:
Run the example, and type the letter z. The filtering is fast. Delete the z, it now took a little more time.
Repeat this procedure few more times. You should notice that it becomes slower and slower each time (my guess would be event handlers leaking, but I didn't confirm it).
With dotTrace I can see that when the first z was typed, OnSourceViewColelctionChanged was called 5150 times.
The the z was deleted, OnSourceViewColelctionChanged was called 15150 times.
After repeating it 5 more times, OnSourceViewColelctionChanged was called 105150 times when the z was typed, and 115150 times when the z was deleted.
Currently, it is much faster (also due to virtualization) to just refresh the entire ListCollectionView