+1  A: 

After searching a bit more I found the solution. Adding an IsSynchronizedWithCurrentItem to the ListBox solved the problem.

<ListBox 
    x:Name="lst" 
    ItemsSource="{Binding Items}" 
    IsSynchronizedWithCurrentItem="True"
    />
Cameron MacFarland
A: 

That isn't a good answer though and I personally would not be happy with it, so I had a go and found an alternative.

This situation only occurs IF the item you are changing is currently selected and you are binding directly to the source.

Use a CollectViewSource between the ListBox and your view model.

<Window x:Class="TestApplication.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
  <Window.Resources>
    <CollectionViewSource x:Key="ViewSource" Source="{Binding Items}" />
  </Window.Resources>
  <StackPanel>
    <Button Content="Change" Click="Button_Click" />
    <ListBox x:Name="lst" ItemsSource="{Binding Source={StaticResource ViewSource}}" />
  </StackPanel>
</Window>

Can't explain what is going on in your example, may be a bug with WPF, but this is a better/cleaner solution. I suspect IsSynchronizedWithCurrentItem="True" is creating a view source for you behind-the-scenes and that is why it works.

HTH,

Dennis Roche
The problem is with the SelectedItems, not the ItemsSource.
Bryan Anderson
So why don't you like using IsSynchronizedWithCurrentItem?
Cameron MacFarland