Перемещение всех выбранных элементов в ListBox с DataSource - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть ListBox, который имеет ObservableCollection<string> в качестве DataSource.Теперь я хочу иметь возможность перемещать каждый выбранный элемент вверх или вниз.Поэтому, если список выглядит следующим образом (выделенные элементы имеют префикс *):

  Item 1
* Item 2
  Item 3
* Item 4
* Item 5
* Item 6
  Item 7

Я хочу, чтобы он выглядел следующим образом после однократного перемещения вниз:

  Item 1
  Item 3
* Item 2
  Item 7
* Item 4
* Item 5
* Item 6

илипосле подъема один раз:

* Item 2
  Item 1
* Item 4
* Item 5
* Item 6
  Item 3
  Item 7

Я уже наткнулся на ObservableCollection<T>.Move(int oldIndex, int newIndex), но я могу заставить его работать только с перемещением одного элемента.

Что было бы хорошим алгоритмом?

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Как уже упоминалось в моем комментарии.Вы можете использовать прямую и обратную петлю, чтобы сделать это.Вот пример программы, которая делает эту работу.Я сделал для кнопок, чтобы различить движение вверх и вниз:

ObservableCollection<string> source = new ObservableCollection<string>();
private void Form1_Load(object sender, EventArgs e)
{
    for (int i = 1; i < 10; i++)
    {
        source.Add("Item " + i);
    }

    listBox1.DataSource = source;
}

private void buttonMoveUp_Click(object sender, EventArgs e)
{
    foreach (int index in listBox1.SelectedIndices)
    {
        if (index > 0) // don't move the first element upwards
        {
            source.Move(index, index - 1);
        }
    }

    listBox1.DataSource = null;
    listBox1.DataSource = source;
}

private void buttonMoveDown_Click(object sender, EventArgs e)
{
    for (int i = listBox1.SelectedIndices.Count - 1; i >= 0; i--)
    {
        int index = listBox1.SelectedIndices[i];
        if (index < source.Count-1) // don't move the last element downwards
        {
            source.Move(index, index + 1);
        }
    }            

    listBox1.DataSource = null;
    listBox1.DataSource = source;
}
0 голосов
/ 20 ноября 2018

Было бы проще (и в некоторых случаях более интуитивно понятным для пользователя), если бы все выбранные строки падали без пропусков между ними, но это должно быть возможно реализовать в любом случае.Вы можете абсолютно использовать метод Move () объекта ObservableCollection, чтобы переместить несколько, вам нужно собрать несколько начальных индексов (для каждого выбранного элемента) в список, а затем выполнить итерацию по этому списку с помощью метода Move (), а также выполнить некоторые вычисления на основев какой позиции указателя находится курсор и в порядке сортировки списка выбранных элементов, чтобы определить, какой будет «новый индекс» для каждого элемента.

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

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