Добавление функциональности отмены выделения не так уж и сложно, и вы на правильном пути. Основная проблема заключается в том, что по умолчанию элементы ListBoxItems внутри ListBox растягиваются по всей длине, что делает довольно трудным , а не нажатие на один.
Вот пример ListBox, который модифицирует ItemContainerStyle по умолчанию, так что элементы занимают только левую часть списка, и между элементами также есть некоторый интервал.
<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;
}