не работает keydown в wpf listview - PullRequest
0 голосов
/ 12 июля 2011

Если я использую список wpf и заполняю его некоторыми элементами без таблички с данными, пользователь может выбрать элемент, набрав первые несколько букв.

Если вы используете просмотр списка или табличку с данными, это не работаетбольше.

Как можно это сделать?

Ответы [ 2 ]

0 голосов
/ 13 июня 2019

Добавить обработчик ключа предварительного просмотра в список:

private void OnConfigRecordsPreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
    e.Handled = Util.ScrollListBoxToLetter<CSVModel>(lvConfigRecords, e.Key.ToString(), i => i.HostName);
}

Добавьте метод расширения для работы linq:


public static List<T> CollectionToList<T>(this ItemCollection collection) where T : class
{
    var list = new List<T>();
    foreach (var item in collection)
    {
        if (item is T)
        {
            var typedItem = item as T;
            list.Add(typedItem);
        }
    }

    return list;
}

public static bool ScrollListBoxToLetter<T>(ListView listView, string key, Func<T, string> TextToMatch) where T : class
{
    if (string.IsNullOrWhiteSpace(key) || key.Length != 1 || !char.IsLetterOrDigit(key.First()))
    { return false; }

    var selectedItem = listView.Items.CollectionToList<T>().Select((item, id) => new { Item = item, Id = id })?.FirstOrDefault(item => (TextToMatch(item.Item)?.FirstOrDefault() ?? ' ').ToString().Trim().ToLower() == key.ToLower());

    if (selectedItem != null)
    {
        listView.SelectedItem = selectedItem.Item;
        listView.ScrollIntoView(selectedItem.Item);

        var item = listView.ItemContainerGenerator.ContainerFromIndex(selectedItem.Id) as ListViewItem;
        if (item != null)
            item.Focus();
    }

    return true;
}
0 голосов
/ 12 июля 2011

Подключитесь к событию PreviewKeyDown и переберите элементы.Если вы столкнулись с элементом, который начинается с нажатой клавиши, установите его как выбранный.

...