Виртуализация списка и отмена выбора всех элементов - PullRequest
7 голосов
/ 15 сентября 2011

В моем приложении у меня есть представление списка со стилем контейнера элемента, привязанным к свойству IsSelected в моей модели представления.

Я также настроил привязку ввода в представлении списка для обработки выбора всех элементов в списке программно, поскольку по умолчанию не работает из-за панели стека виртуализации.Это работает хорошо и хорошо.

Проблема возникает, когда пользователь нажимает на один элемент списка после нажатия CTRL + A.Что пользователь должен ожидать, так это то, что выбранный новый элемент становится единственным выбранным элементом.На самом деле происходит то, что просмотр списка не обновляет свойство IsSelected для элементов, находящихся вне поля зрения, и только элементы, видимые в данный момент, становятся невыбранными.

Как правильно обработать это поведение?

<ListView
    Name="sortList"
    Grid.Row="1" 
    ItemsSource="{Binding RelativeSource={RelativeSource 
    FindAncestor, AncestorType={x:Type UserControl}}, 
    Path=ItemsSource, Mode=TwoWay}">
    <ListView.InputBindings>
        <KeyBinding Gesture="CTRL+A" Command="{Binding SelectAllCommand}" />
    </ListView.InputBindings>

    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
            <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
            <Setter Property="Padding" Value="3" />
            <Setter 
                Property="IsSelected" 
                Value="{Binding Path=IsSelected, Mode=TwoWay}" />
        </Style>
    </ListView.ItemContainerStyle>
</ListView>

Вот команда выбора всех.

private RelayCommand _selectAllCommand;
public System.Windows.Input.ICommand SelectAllCommand
{
    get
    {
        if (_selectAllCommand == null)
            _selectAllCommand = new RelayCommand(param => this.SelectAll());
        return _selectAllCommand;
    }
}

private void SelectAll()
{
    foreach (object o in this.Objects)
       if (!this.SelectedItems.Contains(order))
           order.IsSelected = true;
}

1 Ответ

1 голос
/ 11 октября 2011

Я столкнулся с той же проблемой и помог себе с пользовательским классом, полученным из Sytem.Windows.Controls.ListBox переопределения OnSelectionChanged, как показано здесь VirtualizingStackPanel + MVVM + множественный выбор .

Не идеальное решение в моих глазах, но работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...