I have a ListView that is bound to a ReadOnlyObservableCollection that is the display for a search results and is updated as the user changes search parameters. The ReadOnlyObservableCollection is created from an ObservableCollection in the VM which is how the ReadOnlyObservableCollection is changed by the VM. The items in the ObservableCollection are also sorted on each change. When filtering out items the ListView behaves as expected. When a change to a filter causes items to be added back into the collection several different things can happen.

1) If the number of items in the list takes up less space than height of the ListView all items are added back to the view except those that should be the first items visible in the view.
2) If a single filter is being used and all the characters in the field are deleted at once casing a single PropertyChanged to be raised, all items are added back to the view but not in the order they appeared in the ObservableCollection.

The items do reappear and in the correct order when the mouse wheel is used to scroll down at least past the top visible items and then back to the top. Dragging the scroll bar or clicking the down arrow does not have the same affect. If I do not sort the collection when adding or removing items, some items do not appear in the list until scrolling to the bottom then to the top then back to the position in the list that corresponds to where they are in the collection.

View Model
Code:
Class ProjectSearchViewModel
   Private Projects as ObservableCollection(Of IProject)

   Public ReadOnly Property EntityList As ReadOnlyObservableCollection(Of IProject)

   Sub New(projects as ObservableCollection(Of IProject))

      Me.Projects = projects 
      EntityList = New  ReadOnlyObservableCollection(Of IProject)(Me.Projects)

   End Sub

   Private Sub UpdateSearch  Handles SearchParams.PropertyChanged
   
      'SearchParams is a class that contains all filters for a project and is bound to the input fields on the view
      'Add or remove items in Projects based on current SearchParams property values
   
      Projects.OrderBy(Function(proj) proj.SO) 'SO is just a String

   End Sub

End Class
XAML
Code:
<ListView x:Name="list"
		  Width="300"
		  ItemsSource="{Binding EntityList}"
		  SelectedItem="{Binding SelectedEntity}"
		  ToolTip="Projects List">

	<ListView.ItemTemplate>
		<DataTemplate DataType="{x:Type pmtFrm:IProject}">

			<TextBlock>
				<TextBlock.Text>

					<MultiBinding StringFormat="{}{0} {1}">
						<Binding Path="ProjectNumber" />
						<Binding Path="Name" />
					</MultiBinding>

				</TextBlock.Text>
			</TextBlock>

		</DataTemplate>
	</ListView.ItemTemplate>
</ListView>