Удаление элемента из списка оставляет список без выбранного элемента - PullRequest
0 голосов
/ 09 февраля 2009

У меня есть список WPF, внутри которого есть какой-то пользовательский элемент.

Когда пользователь хочет удалить элемент, происходит то, что ему приходится повторно выбирать вручную в списке после удаления, поскольку список «кажется» теряет фокус ИЛИ не выбранный элемент не существует.

Есть идеи?

Спасибо Jonathan

Ответы [ 2 ]

1 голос
/ 16 января 2014

Я тоже боролся с этой проблемой (отсюда и это редактирование). Решением было сохранить удаленный индекс и сохранить его на потом. Немного взлома, но лучшее, что я нашел на данный момент:

<Window x:Class="KeepFocusAfterDelete.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="200" Width="200">
    <Grid>
        <ListBox KeyUp="ListBox_KeyUp">
            <ListBoxItem>1</ListBoxItem>
            <ListBoxItem>2</ListBoxItem>
            <ListBoxItem>3</ListBoxItem>
            <ListBoxItem>4</ListBoxItem>
        </ListBox>
    </Grid>
</Window>

и код

using System;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
namespace KeepFocusAfterDelete
{
    public partial class MainWindow : Window
    {
        int prev = -1;
        public MainWindow() { InitializeComponent(); }
        private void ListBox_KeyUp(object sender, KeyEventArgs e)
        {
            var list = sender as ListBox;
            switch (e.Key)
            {
                case Key.Delete:
                    prev = list.SelectedIndex;
                    var items = list.SelectedItems.Cast<object>().ToList();
                    foreach (var item in items) list.Items.Remove(item);
                    prev = list.Items.Count > prev ? prev : list.Items.Count - 1;
                    list.SelectedIndex = prev;
                    break;
                case Key.Up:
                    if (-1 != prev)
                    {
                        list.SelectedIndex = prev - 1;
                        prev = -1;
                    }
                    break;
                case Key.Down:
                    if (-1 != prev)
                    {
                        prev = list.Items.Count > prev + 1 ? prev + 1: list.Items.Count - 1; 
                        list.SelectedIndex = prev;
                        prev = -1;
                    }
                    break;
            }
        }
    }
}

Выберите пункт «2», нажмите «Удалить», а затем «Стрелка вниз». Выбранный элемент быстро меняется с элемента «1» на элемент «4».

Спасибо, -Ole

1 голос
/ 09 февраля 2009

Мы всегда справляемся с этим, устанавливая выбранный элемент в коде. Если это был последний элемент в списке, сделайте выбранный индекс последним элементом. В противном случае мы делаем его одним после того, который был удален.

if (SnippetsList.Items.Count > index) 
    SnippetsList.SelectedIndex = index;
else 
    SnippetsList.SelectedIndex = SnippetsList.Items.Count - 1;
...