Отмена выбора в списке WPF с расширенным режимом выбора - PullRequest
5 голосов
/ 04 июня 2009

У меня есть простой список с расширенным режимом выбора. Выбор работает почти идеально, как и в проводнике. Но отмена выбора не очень хорошо работает. Что я хочу, так это то, что, когда я нажимаю на что-то вне диапазона элементов в списке, я хочу, чтобы все элементы были отменены. Похоже, я не так себя веду по умолчанию, и я сделал грязный хак, включив selectionloaded и mouseup, чтобы взломать его. Но должен быть лучший путь. Есть идеи?

Ответы [ 2 ]

3 голосов
/ 05 октября 2010

Я использовал myListBox. SelectedItems.Clear () . Большинство выбранных элементов коллекции доступны только для чтения, но не в списках.

3 голосов
/ 04 июня 2009

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