Как выбрать элемент в списке на основе нажатой буквы, как в этом вопросе, но в UWP? - PullRequest
0 голосов
/ 25 сентября 2018

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

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

<ListBox x:Name="List" ItemContainerStyle="{StaticResource ListBoxItem}" DataContext="{StaticResource VM}" 
                        ItemsSource="{Binding Names, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" DisplayMemberPath="Name"
                             Style="{StaticResource ResourceKey=ListBox}"/>

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Этот метод хорошо сработал для меня.Это немного сложнее, чем ответ 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);
   }
0 голосов
/ 25 сентября 2018

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

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Создатели обновлений и выше.

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