Как выбрать элемент, введя буквенную клавишу клавиатуры в поле со списком WPF?

Я хотел бы иметь возможность выбрать первый элемент в элементах, первая буква которого соответствует нажатой клавише в списке, от A до Z, когда список находится в фокусе.

<ListBox x:Name="List" ItemContainerStyle="{StaticResource ListBoxItem}" DataContext="{StaticResource VM}" 
                        ItemsSource="{Binding Names, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" DisplayMemberPath="Name"
                             Style="{StaticResource ResourceKey=ListBox}"/>
0
Going-gone 25 Сен 2018 в 00:37

2 ответа

Лучший ответ

Когда вы привязываете ItemSource своего combobox к коллекции в вашей ViewModel, тогда все, что вам нужно сделать, это поймать событие KeyDown в вашем ComboBox, а затем соответствующим образом отфильтровать элементы, затем выберите нужный элемент. и, наконец, просто воспользуйтесь , чтобы прокрутить этот элемент перед пользователем.

private void MyComboBox_KeyDown(object sender, KeyRoutedEventArgs args)
{
    if (e.Key == Windows.System.VirtualKey.E)
    {
        //Now you need to select the first item which starts with letter E.
        //Assuming your combobox's itemssource has a binding to a collection named "MyCollection" then this is how you can achieve it :
        var item = MyCollection.First(a=>a.StartsWith("E"));
        //Now you can set this item to the SelectedItem property of your combobox or you can get its index in the collection and then set SelectedIndex of your combobox.
        var index = MyCollection.IndexOf(item);
        MyComboBox.SelectedIndex = index;//now you have selected the desired item
        //LastStep is to bring that selected item into view of the user.
        MyComboBox.SelectedItem.StartBringIntoView();
    }
}

Обратите внимание, что StartBringIntoView доступен только в обновлении для создателей Windows 10 SDK и выше.

1
touseefbsb 24 Сен 2018 в 22:25

Этот метод мне понравился. Это немного сложнее, чем ответ touseefbsb, но я думаю, что они оба будут работать.

private async void StatesList_KeyUp(object sender, Windows.UI.Xaml.Input.KeyRoutedEventArgs e)
    {
        if (!(e.Key >= Windows.System.VirtualKey.A && e.Key <= Windows.System.VirtualKey.Z))
            return;
        string searchLetter = e.Key.ToString();
        ObservableCollection<Type> Names = (ObservableCollection<Type>)List.ItemsSource;
        Type thingToFind;
        if (List.SelectedItem == null)
        {
            thingToFind = Names.Where(x => x.Name.StartsWith(searchLetter)).FirstOrDefault();
        }
        else
        {
            string CurrentName = ((Type)List.SelectedItem).Name;
            var laterItems = Names.Where(x => x.Name.CompareTo(CurrentName) > 0).ToList();
            thingToFind = laterItems.Where(x => x.Name.StartsWith(searchLetter)).FirstOrDefault();
        }
        List.SelectedItem = thingToFind;
        if (thingToFind == null)
            return;
        List.ScrollIntoView(thingToFind);
   }
1
Going-gone 25 Сен 2018 в 15:31