It’s not so dirty to add undo functionality and you are on the right track. The main problem is that by default ListBoxItems inside the ListBox will stretch completely, making it pretty tough not to click on one.
Here's an example ListBox that modifies the default ItemContainerStyle, so the items just occupy the left side of the list, and there’s also some space between them.
<ListBox SelectionMode="Extended"
Width="200" Mouse.MouseDown="ListBox_MouseDown">
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="Background"
Value="LightBlue" />
<Setter Property="Margin"
Value="2" />
<Setter Property="Padding"
Value="2" />
<Setter Property="Width"
Value="100" />
<Setter Property="HorizontalAlignment"
Value="Left" />
</Style>
</ListBox.ItemContainerStyle>
<ListBoxItem >Item 1</ListBoxItem>
<ListBoxItem >Item 2</ListBoxItem>
<ListBoxItem >Item 3</ListBoxItem>
<ListBoxItem >Item 4</ListBoxItem>
</ListBox>
, SelectedItem null EventHandler. ListBoxItem, MouseDown/Click .., SelectedItem SelectedItems. - RoutedEvents MouseDown ListBox , . - ListBox , .
private void ListBox_MouseDown(object sender, MouseButtonEventArgs e)
{
(sender as ListBox).SelectedItem = null;
}