И еще один ответ, более компактный (для разработчиков Java) attr_accessor :x
создает геттеры и сеттеры, чтобы @x
class MyClassA
attr_accessor :x
end
был такой же, как
class MyClassB
def x=(value) #java's typical setX(..)
@x=value
end
def x
@x
end
end
Добавить функцию отмены выделения не так уж и плохо, и вы на правильном пути. Основная проблема заключается в том, что по умолчанию 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;
}