Единственный способ добиться этого - вручную интерпретировать нажатую клавишу в
PreviewKeyDown событие и установить выбранный индекс.
Вы должны установить для handled значение true, иначе представление списка будет также интерпретировать клавиши, что приводит к неправильной навигации по клавишам.
Вот пример с двумя ключами:
private void listView_PreviewKeyDown(object sender, KeyEventArgs e)
{
if (listView.SelectedIndex >= 0)
{
if (e.Key == Key.Right)
{
listView.SelectedIndex++;
}
if (e.Key == Key.Left)
{
listView.SelectedIndex--;
}
e.Handled = true;
}
}
РЕДАКТИРОВАТЬ: 100% чистый MVVM способ с использованием MVVMLight Toolkit
XAML:
xmlns:mvvmLight="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras.WPF4"
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
>
<Grid>
<ListView SelectedIndex="{Binding SelectedIndex}" ItemsSource="{Binding Items}" x:Name="listView">
<i:Interaction.Triggers>
<i:EventTrigger EventName="PreviewKeyDown">
<mvvmLight:EventToCommand PassEventArgsToCommand="True" Command="{Binding PreviewKeyDownCommand}"></mvvmLight:EventToCommand>
</i:EventTrigger>
</i:Interaction.Triggers>
ViewModel:
public ICommand PreviewKeyDownCommand
{
get
{
return new RelayCommand<Object>(x => this.PreviewKeyDown(x as KeyEventArgs));
}
}
private void PreviewKeyDown(KeyEventArgs e)
{
if (SelectedIndex >= 0)
{
if (e.Key == Key.Right)
{
SelectedIndex++;
}
if (e.Key == Key.Left)
{
SelectedIndex--;
}
}
e.Handled = true;
}
private int _selectedIndex;
public int SelectedIndex
{
get { return _selectedIndex; }
set
{
_selectedIndex = value;
NotifyPropertyChanged("SelectedIndex");
}
}