В моем приложении у меня есть представление списка со стилем контейнера элемента, привязанным к свойству 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;
}